2011-03-03 131 views
1

當我的WTL C++應用程序被激活或獲取鍵盤焦點時,我需要確定之前激活/關注過的應用程序的窗口句柄。但是,WM_SETFOCUSWM_ACTIVATE消息的窗口句柄(LPARAM)都是NULL(XP,32位)。WM_SETFOCUS,獲取剛剛失去焦點的應用程序

如何確定當我的應用程序被激活時失去焦點的應用程序?有沒有簡單的方法來做到這一點,或者我需要推出一個特殊的CBT鉤子?

回答

4

一個簡單的方法來查看到底發送了什麼消息以及它們的參數是什麼,打開Spy ++並將其設置爲日誌消息,同時將Alt + Tab切換到另一個窗口。

與自己發現相一致,lParam兩個WM_SETFOCUSWM_ACTIVATENULL當以前的活動窗口(或窗口被激活)是不是在同一個線程。

按照David的說法,您可能會有更多的運氣,WM_ACTIVATEAPP。一旦獲得線程標識符,您可以嘗試調用GetGUIThreadInfo function來確定該線程的活動窗口。即使活動窗口不屬於調用進程,該函數也可以工作。

如果您的應用程序不是一個小型實用程序,而且用戶不希望長期保持打開和運行狀態,那麼考慮到潛在的性能影響,我會盡量避免使用CBT掛鉤。不幸的是,跨進程邊界的這種交互很困難。

如果您不害怕使用可能會影響未來版本Windows的東西,則可以調查RegisterShellHookWindow function。我不能告訴你很多關於它的信息,從來沒有用過它,但是這是一種更簡單的方法來獲取shell的消息,否則它只會通過安裝一個鉤子來獲得。
它早在Windows 2000之前,但直到XP SP1才被包含在SDK中。據我所知,它仍然存在於Windows Vista和7中。

+0

+1我忘記了'RegisterShellHookWindow'!我在我的應用程序中使用它來檢測我的應用程序的.chm幫助文件何時關閉,以便我可以記住它的大小和位置,並在重新啓動時恢復它。紅色的警告文字是相當令人擔憂的,但它似乎在XP到7之間正常工作。 – 2011-03-03 09:43:55