Знайти hwnd головного вікна маючи hinstance

Знайти HWND головного вікна маючи HINSTANCE

Є потреба запустити якусь EXE-шку. EXE-шка чужа, які класи описані в цьому додатку я поняття не маю. Запуск через ShellExecute проходить без проблем і повертається HINSTANCE. Але як знайти HWND головного вікна програми маючи тільки HINSTANCE.

Відсутність результату теж результат. Дякуємо.

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


> Потім перерахувати всі вікна, знайти потік, який цей це
> Вікно створив (GetWindowThreadProcessId)

Всі вікна створилися одним потоком, далі що. Яке з них головне?

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

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

У більшості випадків головне вікно то, що створюється першим, топ-левел, і не має батька. Хоча не факт, що це завжди.

> GetForegroundWindow і швидше за все це вікно буде головним

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

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

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

А в програмах, написаних на Delphi, взагалі чехарда. Першим створюється вікно об'єктом TApplication, яке потім никаться, і "головним" стає першим створив вікно. А головне те, насправді саме вікно TApplication-а.


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

Так я не сперечаюся, що не можна визначити. але в простих додатках це мож спрацювати

так можна перерахувати всі вікна в додатку. і не більше

а все-таки, чому головна вікно відрізняється від неголовне? На мій погляд тільки реакцією на закриття, закриваємо головне вікно - прибиваємо додаток.


> На мій погляд тільки реакцією на закриття, закриваємо
> Головне вікно - прибиваємо додаток.

Тоді у програми створеної на Delphi два "головних" вікна :)

Таке відчуття, що ви про стилі вікна нічого не чули.
зробіть перевірку на стилі WS_OVERLAPPED або WS_OVERLAPPEDWINDOW. і на відсутність стилю WS_CHILD і WS_POPUP. це раз.
два. людина говорить про конкретну програму. значить треба взяти і запустити її, потім запустити WinSight і подивитися стилі, класи і заголовки. і по всьому цьому відловлювати!


> Тоді у програми створеної на Delphi два "головних" вікна
> :)

ні, а чому б і ні?

і взагалі ВІНАП не розрізняє головне віконце неголовне, головним воно буде тільки для програміста з користувачем.

коли створюєш вікно (скажімо за допомогою CreateWindowEx) передаючи замість ParentHwnd 0, то іконка віконця з'явиться в таскбару, вірно?

можна звичайно припустити, що що все віконця з Parent == 0 типу головні, тоді встановлюємо хук на WM_CREATE, витягаємо структуру (CREATESTRUCT) і дивимося Parent.


до речі повертається у ShellExecute HINSTANCE - несправжня HINSTANCE, служить тільки для контролю помилок


> І взагалі ВІНАП не розрізняє головне віконце неголовне, головним
> Воно буде тільки для програміста з користувачем.

Саме так! Простий приклад - ПРОВОДНИК. Яке його вікно головне? Закриття одного - не закриває додаток, але закриття останнього - так.

ти уточни, че за провідник. iexplore.exe або explorer.exe? %)

explorer.exe. Мається на увазі випадок, коли вікно Progman-а відсутній по Каїм-небудь причин (наприклад оболонкою встановлена ​​інша програма). Тоді всі вікна рівні.