2011-09-01 226 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

相关问题