Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.29;
Скачать: CL | DM;

Вниз

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

 
AndrewY ©   (2003-03-31 17:49) [0]

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


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

Никак


 
AndrewY ©   (2003-03-31 18:17) [2]

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


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

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


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


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


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


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

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


 
i-C3H7OH ©   (2003-04-01 18:36) [6]

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


 
DVM ©   (2003-04-01 20:39) [7]

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

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

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



 
Morfein ©   (2003-04-01 20:59) [8]

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


 
DVM ©   (2003-04-01 21:06) [9]

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

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


 
i-C3H7OH ©   (2003-04-01 21:08) [10]


> DVM © (01.04.03 20:39)



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


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


> Morfein © (01.04.03 20:59)


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

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


 
DVM ©   (2003-04-01 21:13) [11]


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

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


 
Morfein ©   (2003-04-01 21:23) [12]

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


 
i-C3H7OH ©   (2003-04-01 21:35) [13]


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


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

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

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

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


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


 
DVM ©   (2003-04-01 21:47) [14]


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

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


 
Morfein ©   (2003-04-01 22:03) [15]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2003.05.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.022 c
14-95001
Zelius
2003-05-07 15:06
2003.05.29
Ради чего народ ходит в форумы?


1-94821
Sodom
2003-05-19 13:12
2003.05.29
Callback function


7-95141
keymaster
2003-03-30 22:25
2003.05.29
Свой шрифт в программе


4-95157
Mali
2003-03-28 16:10
2003.05.29
Убрать иконку из трея


3-94679
kingdom2000
2003-05-11 22:00
2003.05.29
Обновление набора данных!