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

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

Найти HWND главного окна имея HINSTANCE


AndrewY ©   (2003-03-31 17:49:00) 

Имеется надобность запустить некую EXE-шку. EXE-шка чужая, какие классы описаны в этом приложении я понятия не имею. Запуск через ShellExecute проходит без проблем и возвращается HINSTANCE. Но как найти HWND главного окна приложения имея только HINSTANCE.


DVM   (2003-04-01 22:16:00) [1]

explorer.exe. Имеется ввиду случай, когда окно Progman-а отсутствует по каим-либо причинам (например оболочкой установлена другая программа). Тогда все окна равны.


Morfein   (2003-04-01 22:03:00) [2]

ты уточни, чё за проводник... iexplore.exe или explorer.exe? %)


DVM   (2003-04-01 21:47:00) [3]


> и вообще ВинАпи не различает главное окошко неглавное, главным
> оно будет только для программиста с пользователем.

Вот именно! Простой пример - ПРОВОДНИК. Которое его окно главное? Закрытие одного - не закрывает приложение, но закрытие последнего - да.


i-C3H7OH   (2003-04-01 21:35:00) [4]


> Тогда у программы созданной на Delphi два "главных" окна
> :)


не, а почему бы и нет?

и вообще ВинАпи не различает главное окошко неглавное, главным оно будет только для программиста с пользователем.

когда создаешь окно (скажем при помощи CreateWindowEx) передавая вместо ParentHwnd 0, то иконка окошка появится в таскбаре, верно?

можно конечно предположить, что что все окошки с Parent == 0 типа главные, тогда устанавливаем хук на WM_CREATE, извлекаем структуру (CREATESTRUCT) и смотрим Parent.


кстати возвращаемая у ShellExecute HINSTANCE - ненастоящая HINSTANCE, служит только для контроля ошибок


Morfein   (2003-04-01 21:23:00) [5]

Такое ощущение, что вы про стили окна ничего не слышали...
сделайте проверку на стили WS_OVERLAPPED или WS_OVERLAPPEDWINDOW... и на отсутствие стиля WS_CHILD и WS_POPUP... это раз...
два... человек говорит про конкретную программу... значит надо взять и запустить её, потом запустить WinSight и посмотреть стили, классы и заголовки... и по всему этому отлавливать!


DVM   (2003-04-01 21:13:00) [6]


> На мой взгляд только лишь реакцией на закрытие, закрываем
> главное окно - прибиваем приложение.

Тогда у программы созданной на Delphi два "главных" окна :)


i-C3H7OH   (2003-04-01 21:08:00) [7]


> DVM © (01.04.03 20:39)



> Главное окно может быть вообще невидимо и иметь нулевые
> размеры.
> Вывод: главное окно определить нельзя, потому, что нельзя
> сказать, что значит быть главным окном.


Да я не спорю, что нельзя определить , но в простых приложениях это мож сработать


> Morfein © (01.04.03 20:59)


так можно перечислить все окна в приложении. и не более

а все-таки, чем главное окно отличается от неглавного? На мой взгляд только лишь реакцией на закрытие, закрываем главное окно - прибиваем приложение.


DVM   (2003-04-01 21:06:00) [8]

А что толку? Ну, допустим, я в проге создаю два окна, одно за другим (CreateWindowEx), оба абсолютно одинаковые, оба не имеют родителя, которое из них главное, которое первое создано?

А в программах, написанных на Delphi, вообще чехарда. Первым создается окно объектом TApplication, которое потом ныкается, и "главным" становится первое созданное окно. А главное то, на самом деле именно окно TApplication-а.


Morfein   (2003-04-01 20:59:00) [9]

Перед запуском "некой EXE-шки" установи хук WH_CBT... он позволяет перед созданием окна (главного/первого, если хочешь) отловить структуру CREATESTRUCT, которая содержит всю инфу о зарегистрированном классе, на основании котрого было создано окно...
Этот же хук позволяет изменять параметры этой структуры перед созданием окна...


DVM   (2003-04-01 20:39:00) [10]

В большинстве случаев главное окно то, что создается первым, топ-левел, и не имеет родителя. Хотя не факт, что это всегда.

> GetForegroundWindow и скорее всего это окно будет главным

Главное окно может быть вообще невидимо и иметь нулевые размеры.
Вывод: главное окно определить нельзя, потому, что нельзя сказать, что значит быть главным окном.


i-C3H7OH   (2003-04-01 18:36:00) [11]

если приложение не сложное а-ля блокнот, то после (после мааленькой задержечки)запуска екзешника можно вызвать GetForegroundWindow и скорее всего это окно будет главным


jack128   (2003-04-01 17:12:00) [12]

А вообще, что такое ГЛАВНОЕ окно? помоему все окна равнозначны(кроме дочерних, конечно, но тогда можно узнать их родителя)


Игорь Шевченко   (2003-04-01 16:19:00) [13]


> потом перечислить все окна, найти поток, который этот это
> окно создал (GetWindowThreadProcessId)


Все окна создались одним потоком, дальше что ? Какое из них главное ?


jack128   (2003-04-01 14:41:00) [14]

использовать не ShellExecute, a CreateProcess - там возвращается хендл основного потока, а потом перечислить все окна, найти поток, который этот это окно создал (GetWindowThreadProcessId)
Гемор одним словом(хотя может и другие способы есть)


AndrewY   (2003-03-31 18:17:00) [15]

Отсутствие результата тоже результат. Спасибо.


Игорь Шевченко   (2003-03-31 17:57:00) [16]

Никак


Наверх

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