Знайти 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-а відсутній по Каїм-небудь причин (наприклад оболонкою встановлена інша програма). Тоді всі вікна рівні.