2011-09-01 58 views
15

在VC++中,我使用EnumWindows(...),GetWindow(...)和GetWindowLong()來獲取窗口列表並檢查窗口是否是頂層窗口(沒有其他窗口作爲所有者),以及是否該窗口可見(WS_VISIBLE)。但是,雖然我的桌面只顯示5個窗口,但是這個EnumWindows給了我50個窗口,多麼有趣!任何Windows怪胎在這裏請幫我澄清...爲什麼EnumWindows會返回比我預期更多的窗口?

+1

我甚至看到一個窗口ç alled「開始按鈕」 – jondinham

+7

這是因爲開始按鈕是一個窗口。 –

回答

27

列出了(在使用Alt-Tab框或類似)在任務欄僅適用於Windows的方式由雷蒙德這篇文章在MSDN博客中描述:
http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx

這是超級函數來檢查是否示於ALT-選項卡窗口:

BOOL IsAltTabWindow(HWND hwnd) 
{ 
    TITLEBARINFO ti; 
    HWND hwndTry, hwndWalk = NULL; 

    if(!IsWindowVisible(hwnd)) 
     return FALSE; 

    hwndTry = GetAncestor(hwnd, GA_ROOTOWNER); 
    while(hwndTry != hwndWalk) 
    { 
     hwndWalk = hwndTry; 
     hwndTry = GetLastActivePopup(hwndWalk); 
     if(IsWindowVisible(hwndTry)) 
      break; 
    } 
    if(hwndWalk != hwnd) 
     return FALSE; 

    // the following removes some task tray programs and "Program Manager" 
    ti.cbSize = sizeof(ti); 
    GetTitleBarInfo(hwnd, &ti); 
    if(ti.rgstate[0] & STATE_SYSTEM_INVISIBLE) 
     return FALSE; 

    // Tool windows should not be displayed either, these do not appear in the 
    // task bar. 
    if(GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) 
     return FALSE; 

    return TRUE; 
} 

貸記到源代碼在這裏:
http://www.dfcd.net/projects/switcher/switcher.c

+1

任何人都知道爲什麼這個函數似乎沒有考慮Raymond在他的博客文章中提到的'WS_EX_TOOLWINDOW'和'WS_EX_APPWINDOW'擴展樣式案例? 「STATE_SYSTEM_INVISIBLE」是否覆蓋它,或者這個函數與Raymond描述的函數不完全匹配? –

+0

@adamsmith toolwindow不是頂層窗口,它不會顯示在任務欄或alt-tab菜單中。因爲toolwindow的父窗口不爲空 – jondinham

+5

另一個改進是從列表中刪除工具窗口,該工具窗口也不應顯示。正如@DavidHeffernan在其他答案中提到的那樣,在[以下MSDN文章](http://http//msdn.microsoft.com/en-us/library/aa969325.aspx)中有記錄。我已經通過檢查改進了上面的代碼: 'if(GetWindowLong(hwnd,GWL_EXSTYLE)&WS_EX_TOOLWINDOW) return FALSE;' –

3

你談論的窗口,與X按鈕和標題欄等不是唯一的窗口。按鈕,下拉菜單,標籤,圖標,文本框,任務欄以及其他所有內容都是窗口。所以EnumWindows正在做它應該做的事情:列舉所有頂級窗口。

即使這是真的,EnumWindows只能枚舉頂層窗口。這意味着it won't enumerate any child windows

EnumWindows函數不枚舉子窗口,與由具有WS_CHILD樣式的系統擁有一些頂層窗口除外。

但是,桌面上的很多東西都是windows,而不僅僅是您想要的「窗口」。

+0

所以任何想法擺脫不相關的「所謂」窗口?我只想要一個可見的窗口列表(應用程序窗口,而不是對話框,而不是按鈕等) – jondinham

+2

你可能只需要[出現在任務欄中的窗口](http:// http://msdn.microsoft.com/en -us /庫/ aa969325.aspx)。 「當應用程序創建一個未被擁有的窗口時,Shell會在任務欄上創建一個按鈕,爲了確保窗口按鈕放置在任務欄上,使用WS_EX_APPWINDOW擴展樣式創建一個無主窗口。放置在任務欄上,使用WS_EX_TOOLWINDOW擴展樣式創建無主窗口。或者,您可以創建一個隱藏窗口,並將該隱藏窗口設置爲可見窗口的所有者。 –

+0

是的,我想要出現在任務欄中的窗口列表。我知道如何隱藏,以不同的模式顯示窗口;但我不知道如何得到這個列表 – jondinham

相關問題