Как работает GetGuiThreadInfo ()? - PullRequest
2 голосов
/ 26 марта 2010

Я пытаюсь получить HWND и ThreadID для текущего сфокусированного окна.

Обычно GetForegroundWindow (), а затем вызов GetThreadProcessId () дает мне правильную информацию.

Но в случае IE8 HWnd GetForegroundwindow () дает мне HWND фрейма IE, но на самом деле сфокусированное окно (объект документа или Internet Explorer_server) отличается (работает в другом процессе). Так что подход GetForegroundWindow () не работает.

Итак, я использовал GetGuiThreadInfo (DWORD tid) и передал ему threadId, полученный из GetForegroundWindow ... что-то вроде этого;

DWORD tid = GetWindowThreadProcessId(GetForegroundWindow(),0);
GetGuiThreadInfo(tid,&guiThreadInfoObject);
HWND focus = guiThreadInfoObject.hwndFocus;

Используя вышеупомянутый подход, я получаю правильный HWND для объекта Internet Explorer_server, который является правильным. Однако я не понял, хотя GetGuiThreadInfo () получает ThreadId потока в другом процессе, то есть IE Frame, как он может получить информацию из потока об объекте Internet Explorer_server, который находится в другом процессе и потоке?

Спасибо

Ответы [ 2 ]

2 голосов
/ 26 марта 2010

Получить окно с фокусом довольно легко с помощью GetFocus (). Хотя я думаю, что GetGuiThreadInfo () использует внутренние данные из оконного менеджера. Ваш подход может потерпеть неудачу, если IE свернут или не имеет фокуса.

Вместо этого используйте EnumChildWindows (), итеративно для каждого найденного вами дочернего элемента, пока не получите окно, вызов GetClassName () которого возвращает «Internet Explorer_Server».

Спасибо, что подняли это, кстати. То, что делает IE, категорически запрещено в документации для SetParent (). Я знал только о том, что Acrobat нарушает это правило, но теперь вы предоставили доказательства того, что программа Microsoft делает это. Это решает вопрос, это уже не правило!

0 голосов
/ 26 марта 2010

GetWindowThreadProcessId извлекает идентификатор потока, который создал (в вашем случае передний план) окно.
guiThreadInfoObject.hwndFocus - это окно ввода фокуса.

Здесь есть некоторая свобода действий - я не нашел ни одного места, в котором бы конкретно указывалось, что окно переднего плана - это то, где есть фокус ввода. (может быть, он получает уже родитель / владелец верхнего уровня?).

Кроме того, AttachThreadInput может немного изменить игру - установив фокус ввода потоков в окно другого процесса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...