Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Показ главного окна запущенного приложения [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]


Наверх

Титульная страница Поиск, карта сайта Написать письмо