为什么FindWindow会找到一个EnumChildWindows没有的窗口?

时间:2012-03-01 14:49:28

标签: c++ windows winapi

我正在寻找一个类名为“CLIPBRDWNDCLASS”的窗口(它可以在办公应用程序和其他应用程序中找到)。

如果我使用FindWindow或FindWindowEx,我会找到第一个拥有此类的HWND,但是我希望所有具有该类的窗口,所以我决定使用递归的EnumChildWindows来枚举所有窗口并查找我想要的窗口:

//-------------------------------------------------------------------------------
BOOL CALLBACK enum_wnd_proc(HWND h, LPARAM lp)
{
    char cls[1024] = {0};
    ::GetClassNameA(h, cls, 1024);

    if(std::string(cls) == "CLIPBRDWNDCLASS")
    {
        // match!
    }

    ::EnumChildWindows(h, enum_wnd_proc, NULL);

    return TRUE;
}
//-------------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
    ::EnumWindows(enum_wnd_proc, NULL); 
    return 0;
}
//-------------------------------------------------------------------------------

这就是EnumWindows不会返回此窗口,只能通过FindWindow返回。

有谁能说出它为什么不起作用?

2 个答案:

答案 0 :(得分:7)

EnumWindows不起作用的原因是您要查找的窗口是message only window

FindWindowEx可以在两种情况下找到它们:

  1. 如果hwndParenthwndChildAfter都为NULL。
  2. 如果您指定'HWND_MESSAGE'作为父窗口。
  3. 此代码将为您找到所有相关窗口(来自here的解决方案的修改版本):

    HWND hWindow = FindWindowExA(HWND_MESSAGE, NULL, "CLIPBRDWNDCLASS", NULL);
    while (hWindow )
    {
        // Do something here with window...
    
        // Find next window
        hWindow = FindWindowExA(HWND_MESSAGE, hWindow , "CLIPBRDWNDCLASS", NULL);
    }
    

    另请注意,与上述链接中的内容不同,GetParent()仅针对消息的窗口返回HWND_MESSAGE(至少不适用于我的测试)。

答案 1 :(得分:4)

我简单的方法来记录所有仅限消息的窗口:

EnumChildWindows(GetAncestor(FindWindowEx(HWND_MESSAGE,0,0,0),GA_PARENT),addr EnumChildProc,0)

// GetAncestor(FindWindowEx(HWND_MESSAGE,0,0,0),GA_PARENT)=“GetMessageWindow”(类“消息”)

// GetAncestor(FindWindowEx(HWND_DESKTOP,0,0,0),GA_PARENT)= GetDesktopWindow(类“#32769”)