2010-08-13 67 views
0

我使用CBT Windows Hook來檢測窗口創建/刪除/ min-max/move-size事件。檢測應用程序窗口

我工作的很好,但我需要過濾來自正常小部件的事件。實際上,我只需要通過CBT鉤子通知用戶認爲Windows的那些窗口。

,我要面對讓我瘋了,因爲我時間可持續獲得虛假的事件,即使我過濾窗口如下問題:

BOOL FilterWindowHandle(HWND hwnd) 
{ 
    // Filtered window having WS_CHILDWINDOW style 
    if ((GetWindowLongPtr(hwnd, GWL_STYLE) & WS_CHILDWINDOW) != 0) 
     return (TRUE); 
    // Filtered window not having WS_CAPTION style 
    if ((GetWindowLongPtr(hwnd, GWL_STYLE) & WS_CAPTION) == 0) 
     return (TRUE); 
    // Not filtered 
    return (FALSE); 
} 

那些假事件源於陰影效果,菜單,一切都顯示在屏幕上。

是否有一個強大的方法來過濾從它的孩子真正的Windows?

我避免了WS_BORDER或類似的測試,因爲有些應用程序可能會創建沒有邊框的主窗口......或者我錯了嗎?

+0

你是具有一定標準的人。你在腦海裏想要定義一個「真正的窗口」是什麼,這與操作系統認爲的一個窗口不同。定義該條件,並編寫代碼以匹配它。 提示:使用Spy ++查看系統上窗口的窗口樣式,而此MSDN應該幫助您找到解決方案。 – tenfour 2010-08-13 15:36:17

+0

@tenfour比說話更容易! ;) – Luca 2010-08-13 15:37:42

+0

也許,但最終你必須知道你在做什麼,以及這些樣式意味着什麼。沒有人說編程很容易:) – tenfour 2010-08-13 15:42:12

回答

1

非常適合「用戶視窗」,是在Alt-Tab列表(或任務欄)中顯示的一組窗口。

這OldNewThing文章解釋了規則(儘管規則是不固定的或保證保持相同):

的一般規則是:

對於每個可見的窗口,走上它的 所有者鏈,直到找到根 所有者。然後沿着可見的 最後一個活動彈出鏈往回走,直到找到 一個可見窗口。如果你回到 開始,然後將 窗口放在Alt + Tab列表中。

這可以通過明確的窗口樣式覆蓋:

與WS_EX_TOOLWINDOW 擴展樣式的窗口被看作它 是不可見的,即使它是。帶有WS_EX_APPWINDOW 擴展樣式的 窗口被視爲沒有所有者,即使它具有 。

查看完整的OldNewThing帖子,這兩個引用來自更詳細的信息。

0

我過去使用的一個有用的標準是測試窗口是否是頂層窗口,即其父項是NULL。