|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Изменить заголовок окна программы после её запуска зная только exe файл и его handle
Сабж в названии темы=) Как это реализовать?
|
#2
|
||||
|
||||
Без доп. софта - никак. Пиши сервер.
Кнопка "+" - весы в правом верхнем углу сообщения... |
#3
|
|||
|
|||
зачем доп. софт?
Процесс создаётся через creteprocess а то что создано CreateProcess возваращает мне хендл программы.. как зная хендл программы узнать его видимое на экране окно и изменить заголовок? |
#4
|
||||
|
||||
Тьфу, *ля. Смотрел тему "** по сети" потом переключился на твою, вот и показалось "Изменить заголовок по сети бла бля бла".
А так помоему есть ф-я API - какому процессу принадлежит окно. Смотри все окна, если найдешь нужное меняй. Кнопка "+" - весы в правом верхнем углу сообщения... |
#5
|
||||
|
||||
если я правильно вас понял...
Код:
procedure TForm1.FormShow(Sender: TObject); var h:HWND; begin h:=FindWindow(nil, 'Form1'); SetWindowText((h),'Delphi World FOREVER!!!'); end; |
#6
|
||||
|
||||
Код:
function EnumThreadWndProc(hwnd: THandle; lParam: LPARAM): Boolean; stdcall; var len: Integer; classname: array [0..$ff] of Char; begin Result:=True; // если окно видимое, то if IsWindowVisible(hwnd) then begin // получаем его класс len:=GetClassName(hwnd, @classname, SizeOf(classname)); if len>0 then // и заголовок меняем на класс SetWindowText(hwnd, PChar(Copy(classname, 1, len))); end; end; procedure TForm1.Button1Click(Sender: TObject); var startupinfoa: _STARTUPINFOA; processinformation: _PROCESS_INFORMATION; begin // инициализируемся ZeroMemory(@startupinfoa, SizeOf(_STARTUPINFOA)); startupinfoa.cb:=SizeOf(_STARTUPINFOA); startupinfoa.wShowWindow:=SW_SHOWNORMAL; // создаем процесс mshearts.exe CreateProcess(nil, PChar('mshearts.exe'), nil, nil, False, 0, nil, nil, startupinfoa, processinformation); // ждем максимум 10 сек пока не создадутся окна WaitForInputIdle(processinformation.hProcess, 10000); // найдем все окна нашего процесса EnumThreadWindows(processinformation.dwThreadId, @EnumThreadWndProc, 0); end; |
#7
|
|||
|
|||
хм ваш пример хорошо работает! Но в моей программе что-то не так:
Код:
function TAppThread.EnumThreadWndProc(hwnd: THandle; lParam: LPARAM): Boolean; stdcall; var len: Integer; classname: array [0..$ff] of Char; begin Result:=True; if IsWindowVisible(hwnd) then begin len:=GetClassName(hwnd, @classname, SizeOf(classname)); if len>0 then SetWindowText(hwnd,PChar(AppInfo.AppUserCaption)); end; end; { TAppThread } procedure TAppThread.Execute; var i: integer; wd:HWND; begin while AppInfo.AppStart do //пака стоит галочка "запуск при старте HLR" begin ZeroMemory(@SI, SizeOf(SI)); //нулируем данные о процессе with PI do begin SetProcessAffinityMask(hProcess, AppInfo.AppCPUAffinity); //приоритет процесса WaitForSingleObject(hProcess, INFINITE); //Ждём завершения программы бесконечно.. CloseHandle(hProcess); //закрываем хендл процесса CloseHandle(hThread); //закрываем хендл потока end; CreateProcess( PChar(AppInfo.AppExe), PChar(AppInfo.AppParamStr), nil, nil, False, GetPriority(AppInfo.AppPriority), nil, PChar(ExtractFileDir(AppInfo.AppExe)), SI, PI); EnumThreadWindows(PI.dwThreadId, @EnumThreadWindows, 0); Я пытаюсь поместить текст из AppInfo.AppUserCaption в заголовок программы, но почему-то ничего не происходит! Хатя на простом примере , отдельно созданном все нормально. пытаюсь задействовать на калькуляторе. (На примере все ок работает с калькулятором) |