![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Показ главного окна запущенного приложения [D7, WinXP]
Gilk © (2003-11-17 14:02:00)С помощью ShellExecuteExзапускаю некоторое приложение.
Необходимо на определенное событие срабатывающее после запуска и переключения на другие программы, показать основное окно этого приложения. ShowWindowтребует Handle окна,- а у меня есть Handle процесса.
Заранее спасибо.
GrayFace (2004-01-14 20:42:00) [1]Возможно первое окно - это кнопка таскбара, так что можно попробовать брать второе.
GrayFace (2004-01-14 20:29:00) [2]Есть 2 идеи:
1) Поставить hook на создание окон. Первое созданное окно данного процесса должно быть главным.
2) Из всех окон процесса выбрать то, у которого меньше handle. Скорее всего оно создано первым.
jack128 (2004-01-14 09:35:00) [3]
> Gilk © (17.11.03 18:17) [11
Еще раз - проблема не в том, чтобы найти окна запущенного приложения, в том, что определить какое из этих окон - главное. Так как какое из окон - главное, определяется по субъективному мнению юзера, то В ОБЩЕМ СЛУЧАЕ задача не решаема.
GrayFace (2004-01-14 02:36:00) [4]Может быть WinMain поможет.
Gilk (2003-11-17 18:17:00) [5]Идея FireHack натолкнула на мысль:
т.к. GetWindowThreadProcessId(H, WPD) при входном Handle'e окна,- в выходном параметре получает Handle процесса - то перебирать все окна пока не найдется окно с нужным Handle'ом процесса
FireHack (2003-11-17 16:42:00) [6]для ОБЩЕГО случая - это единственный метод. К тому же основногоокна может и не быть, а так можно анализировать созданные данным приложением окна.
Digitman (2003-11-17 16:32:00) [7]
> FireHack
> одним из окон приложения
ну и какое из найденных, по-твоему, будет "основным" ? куча кодовых потоков целевого процесса вполне может создать кучу окон !!! из которых только одно - основное в каждый момент времени !!
а критерии озднозначного поиска автору заранее не известны, по условию
FireHack (2003-11-17 16:29:00) [8]во-первых, используй CreateProcess, чтобы узнать не только хэндл, но и Id процесса, а затем
function EnumProc(H:HWND; P:LPARAM):BOOL;stdcall;
var
WPID:DWORD;
begin
GetWindowThreadProcessId(H, WPD);
if WPD=PI.dwProcessId then {это окно явл. одним из окон приложения}
end;
Digitman (2003-11-17 15:51:00) [9]
> FireHack
> EnumWindows вполне может помочь
чем же это, интересно ?
FireHack (2003-11-17 15:48:00) [10]>непосильную задачу ставишь себе...
EnumWindows вполне может помочь
Digitman (2003-11-17 15:44:00) [11]
> т.к. запускаются произвольные приложения
непосильную задачу ставишь себе... практически нерешаемую в общем случае
Gilk (2003-11-17 15:36:00) [12]Заранее параметры окна не знаю т.к. запускаются произвольные приложения
Digitman (2003-11-17 15:25:00) [13]открывай утилиты SPYXX или WinSight, локализуй искомое окно - будешь знать параметры ф-ции FindWindow
Gilk (2003-11-17 14:26:00) [14]Есть только Handle process'a и параметы получаемые через ShellExecuteEx
Digitman (2003-11-17 14:22:00) [15]если известны имя класса окна и/или имя самого окна, то хэндл окна ищется вызовом ф-ции FindWindow[Ex]