Заголовок окна Измененное событие - PullRequest
6 голосов
/ 07 января 2012

Если окно, например, Firefox меняет название с Firefox на Stack Overflow - Firefox, затем я хочу, чтобы мое приложение записало, что Firefox изменило название.

Возможно ли это без использования ловушки и петли (EnumWindows)? Если это можно сделать только с помощью крючка, какой тип крючка?

Ответы [ 2 ]

10 голосов
/ 11 января 2012

WinEvents это путь сюда.Необходимый вам API: SetWinEventHook () - если вы заботитесь о конкретном окне, используйте GetWindowThreadProcessId (), чтобы получить threadId HWND, а затем прослушивать события только из этого конкретного потока.Для изменения заголовка окна вам понадобится событие EVENT_OBJECT_NAMECHANGE.

Вы можете перехватывать либо «в контексте», либо «вне контекста» - последнее является самым простым и означает, что событие доставляется обратно в ваш собственныйпроцесс, поэтому вам не нужна отдельная DLL - что позволяет делать все это в C #;но поток, вызывающий SetWinEventHook, должен иметь цикл обработки сообщений (GetMessage / TranslateMessage / DispatchMessage), поскольку события доставляются с использованием формы сообщений за кулисами.

В обратном вызове WinEvent вам необходимо проверитьчто вам нужен HWND, так как вы получите изменения имени для любого пользовательского интерфейса в этом целевом потоке, возможно, включая изменения имени дочернего окна или другие вещи, которые вас не волнуют.

-

Кстати, вы можете проверить этот ответ для некоторого примера кода C #, который использует WinEvents;он использует их для отслеживания изменений окон переднего плана во всех окнах на рабочем столе;но нужно просто сделать несколько простых изменений, описанных выше, чтобы отслеживать изменения имени в конкретном окне.

3 голосов
/ 07 января 2012

Вам понадобится крючок (или метод опроса, который вы упомянули в своем вопросе).

В основном в Windows API, чтобы изменить «заголовок окна» - или, точнее, текст окна - вы отправляете WM_SETTEXT, поэтому ваша ловушка должна перехватить это сообщение. Тип перехватчика, который вам нужен, - WH_CALLWNDPROC, и просто проверьте, является ли полученное вами сообщение WM_SETTEXT, а hWnd - главное окно для просматриваемого приложения (чтобы вы не получали ложных срабатываний, например приложение пытается установить текст дочерних окон).

Небольшое примечание: здесь, вероятно, дело не в этом, но имейте в виду, что заголовок, который вы видите, на самом деле можно просто нарисовать там вручную, не используя обычный Windows API. Используйте Spy ++ или что-то еще, чтобы увидеть, что происходит, прежде чем идти слишком далеко по этому маршруту, вы можете потратить много времени впустую.

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