[英]Window Title Changed Event
如果一個窗口,例如Firefox,將其標題從Firefox
更改為Stack Overflow - Firefox
那么我希望我的應用程序記錄Firefox更改其標題。
這可能不使用鈎子和循環(EnumWindows)? 如果只能用鈎子做什么鈎子?
WinEvents是去這里的方式。 您需要的API是SetWinEventHook() - 如果您關心特定窗口,請使用GetWindowThreadProcessId()獲取HWND的threadId,然后僅偵聽來自該特定線程的事件。 對於窗口標題更改,您將需要EVENT_OBJECT_NAMECHANGE事件。
您可以掛鈎“在上下文中”或“在上下文中” - 后者是最簡單的,並且意味着事件被傳遞回您自己的進程,因此您不需要單獨的DLL - 這使得它可以執行它全部用C#; 但是調用SetWinEventHook的線程必須有一個消息循環(GetMessage / TranslateMessage / DispatchMessage),因為事件是在幕后使用一種消息形式傳遞的。
在WinEvent回調中,您需要檢查HWND是否是您關心的那個,因為您將獲得該目標線程上任何UI的名稱更改,可能包括子窗口名稱更改或其他您不關心的內容關心。
-
順便說一下,您可以查看一些使用WinEvents的示例C#代碼的答案 ; 它正在使用它們來跟蹤桌面上所有窗口的前景窗口變化; 但是,我們應該采取上面列出的一些簡單修改來跟蹤特定窗口上的名稱更改。
您將需要一個鈎子(或您在問題中提到的輪詢技術)。
基本上在Windows API中,要更改“窗口標題” - 或者更確切地說是窗口文本 - 您發送WM_SETTEXT
,因此您的鈎子需要攔截該消息。 你需要的鈎子類型是WH_CALLWNDPROC
,只是檢查你收到的消息是否是WM_SETTEXT
,而hWnd
是你正在查看的應用程序的主窗口(所以你不會得到誤報,比如應用程序試圖設置兒童窗戶的文字)。
請注意:雖然這可能不是這種情況,但請注意,您看到的標題實際上可以手動繪制,而不是通過常用的Windows API。 使用Spy ++或其他東西看看在這條路線走得太遠之前發生了什么,你可能會花費大量時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.