Форум » [x]Harbour » Хендл окна из процесса » Ответить

Хендл окна из процесса

fil: Всем привет ! Чего-то забыл как получить хендл окна из процесса (оно там одно, но попапное, за заголовок не ухватищь) oList:= oWmi:ExecQuery(.. for each oProc in oList oProc - вот из него получить хендл окна

Ответов - 12

Dima: http://fivetechsupport.com/forums/viewtopic.php?f=3&t=29279 https://www.activexperts.com/admin/scripts/wmi/perl/0413/

fil: И чего ? Всяких сврйств много, но хендла окна процесса я не увидел Можно пойти от обратного - прокрутить по Enum все окна и найти принадлежащее нужному мне процессу

Dima: fil пишет: И чего ? Ты или ссылки не смотрел или я не то дал :) Я про это fil пишет: oProc - вот из него получить хендл окна oProc:Handle


fil: Ну, некий хендл получаю. Вот тока сомневаюсь, что это хендл окна Проверил это сделав Parent'ом окно своего приложения - не встраивается

Haz: fil пишет: Вот тока сомневаюсь, Чтобы не сомневаться. Найди две маленькие программы 1)WinSpy 2)WmiExplorer Обе бесплатные, и работают без установки. Первая отображает полную инфу о любом окне в системе. Вторая визуализирует Wmi запросы Без них с окнами и вимиаями в слепую можно тыкаться долго)

Haz: Haz пишет: некий хендл получаю. Это хендл процесса

Haz: fil пишет: Чего-то забыл как получить хендл окна из процесса В завершение Только через WMI эту задачу не решишь. Нет в WMI окон процесса. Можно получить хендл процесса, потом хендл потока в котором этот процесс живет. Потом перебирая окна системы сравнивать из какого потока окно с нашим потоком. Возможно есть путь и короче ... я не нашел . Ломаешь чей то софт ? Лучше WinSpy++ посмотри характеристики окна и попробуй выделить уникальные (класс, размеры, стиль, текст в окне , дочерние окна такие как кнопки и надписи на них и пр) и искать уже по этим признакам через перебор окон системы. Хендл процесса ничего тебе не даст , тк то что ты видишь одно окно не гарантирует что у процксса нет еще сотни

fil: Возможно.

fil: Ну вроде так я его поймал hWn:=GetWindowThreadProcessID(GetForegroundWindow(), oProc:Handle) Хотя, конечно, условие, что искомое приложение на переднем плане..

Haz: fil пишет: Ну вроде так я его поймал Я запутался, ты что ловил то ? GetForegroundWindow() и так возвращает хендл приоритетного( выделенного) окна GetWindowThreadProcessID() - возвращает ID потока который создал указанное в параметрах окно , и также возвращает ID процесса через ссылку в параметрах вроде тебе нужен хендл окна и ты его получил выделив на передним плане через GetForegroundWindow(), тогда к чему огород с GetWindowThreadProcessID

Haz: fil пишет: hWn:=GetWindowThreadProcessID(GetForegroundWindow(), oProc:Handle) oProc:Handle в этот параметр (если задан) копируется ID процесса который создал окно а не наоборот hWn - это правильнее обозначить как hTh т.к. это хендл потока вызов такой hTh := GetWindowThreadProcessID(hWnd, @hPid) в hTh запишется хендл потока , который создал hWnd в hPid запишется хендл процесса, который создал hWnd таким образом перебирая все окна и скармливая их в GetWindowThreadProcessID() сравниваем полученный hPid с oProc:Handle и если совпали то это окно создано из процесса oProc:Handle Пример перебора окон на форуме был , я точно кидал в теме по Excel

fil: GetForegroundWindow Haz это да, каюсь перемудрил. Очень уж хотелось прямо из процесса окно достать. Ну через Enum сделаю. Спасибо



полная версия страницы