2012-01-06 131 views
6

如果窗口是例如Firefox,將其標題從Firefox更改爲Stack Overflow - Firefox,然後我希望我的應用程序記錄Firefox更改其標題。窗口標題已更改事件

這可能沒有使用鉤子和循環(EnumWindows)?如果只能用鉤子完成,哪種類型的鉤子?

+0

您是否在談論單個瀏覽器以及重定向..?你有沒有在Request/Response和頭文件中搜索?只是好奇,如果我在同一頁上,你是.. – MethodMan 2012-01-06 20:54:06

+1

是的,需要掛鉤。很確定我已經告訴過你關於WH_SHELL。 – 2012-01-06 21:01:35

+1

可能重複的[記錄在Windows中關閉所有Windows](http://stackoverflow.com/questions/8648386/log-all-windows-that-are-closed-in-windows) – 2012-01-06 21:02:12

回答

9

WinEvents是去這裏的路。您需要的API是SetWinEventHook() - 如果您關心特定窗口,請使用GetWindowThreadProcessId()獲取HWND的threadId,然後僅偵聽來自該特定線程的事件。對於窗口標題更改,您需要EVENT_OBJECT_NAMECHANGE事件。

你可以勾住「在上下文中」或「在上下文之外」 - 後者是最簡單的,並且意味着事件被傳遞迴自己的進程,所以你不需要單獨的DLL - 這使得它可能在C#中做到這一切;但調用SetWinEventHook的線程必須有一個消息循環(GetMessage/TranslateMessage/DispatchMessage),因爲事件是在幕後使用消息形式傳遞的。

在您的WinEvent回調中,您需要檢查HWND是否是您關心的人,因爲您將獲得該目標線程上任何UI的名稱更改,可能包括子窗口名稱更改或其他事情你不在乎。

-

順便說一句,你可以檢查this answer爲使用的WinEvents一些C#示例代碼;它使用它們來跟蹤桌面上所有窗口的前景窗口變化;但是應該只是進行一些簡單的修改,以便跟蹤特定窗口上的名稱更改。

+1

EVENT_OBJECT_NAMECHANGE發生了很多事情,即使將鼠標移動到同一個窗口的同一個選項卡上,也會觸發EVENT_OBJECT_NAMECHANGE!它與你所說的「可能包括子窗口名稱變化」有關,但是如何避免這種情況?只是忽略回調中同樣的經常性「窗口標題」? – JohnTube 2014-02-25 16:09:42

+1

如果您只對一個進程中的更改感興趣,則可以在「SetWindowEventHook」調用中指定進程的ID,這將大大減少所觀察事件的數量。 – 2016-06-21 14:20:46

+0

@BrendanMcK我在切換窗口時得到了標題,例如。從chome> notepad> visualstudio,但沒有得到如何實現在visualstudio中更改選項卡或文檔更改的事件。你能幫忙嗎?問候 – 2016-10-27 11:06:02

3

您將需要一個鉤子(或您在問題中提到的輪詢技巧)。

基本上在Windows API中,要更改「窗口標題」 - 或者更確切地說窗口文本 - 您發送WM_SETTEXT,所以您的掛鉤需要截取該消息。您需要的鉤子類型爲WH_CALLWNDPROC,只需檢查您收到的郵件是否爲WM_SETTEXT,而hWnd是您正在查看的應用程序的主窗口(因此您不會像應用程序嘗試設置兒童窗戶的文字)。

這裏小記:雖然這可能不是這種情況,但請注意,您看到的標題實際上只能手動繪製,而不是通過常規的Windows API進行繪製。使用Spy ++或其他東西來看看發生了什麼事情之前,沿着這條路線走得太遠,你可能會花費大量的時間。

+1

這會工作,但不是最簡單的方法。 WH_CALLWNDPROC掛鉤的問題是你需要一個單獨的C/C++ DLL--你不能在C#中完成所有的工作。 (另外,如果你關心的話,你需要單獨的32位和64位代碼鉤子。)SetWinEventHook在這裏可能會更適合,因爲你可以將通知傳遞迴你自己的進程,避免需要單獨的DLL。 – BrendanMcK 2012-01-11 07:18:36

+0

你已經發布了你的答案,爲什麼要打擾這個評論? – Blindy 2012-01-11 13:13:08

+5

因此,一個潛在的未來SO讀者會理解這兩種技術如何相互關聯,或者即使只能掃描接受的答案也會看到這個警告;評論比單獨的答案具有更好的空間局部性。 – BrendanMcK 2012-01-11 14:12:02

-7

你不需要任何鉤子。只需使用Windows事件

+3

.......比如? – LarsTech 2012-01-08 14:08:04

+0

@fred,這不是一個非常有用的答案:Windows有很多可用的功能,可以描述爲事件。如果你是谷歌的「寡婦事件」,你會得到一個Windows事件日誌記錄的第一場比賽,這是一個完全不相關的技術。至少提供一個API名稱或類似名稱(最好帶有鏈接),以便讀者能理解你在說什麼。 – BrendanMcK 2012-01-11 07:13:49