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

TCS*_*TCS 4 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;
}
//-------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

这是因为EnumWindows不会返回此窗口,只能通过FindWindow返回.

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

Asa*_*saf 9

原因EnumWindows不起作用是您要查找的窗口是仅消息窗口.

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

  1. 如果这两个hwndParenthwndChildAfter是NULL.
  2. 如果指定"HWND_MESSAGE"作为父窗口.

此代码将为您找到所有相关窗口(此处的解决方案的修改版本):

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);
}
Run Code Online (Sandbox Code Playgroud)

还要注意的是不像什么写在上面的链接,GetParent()对于消息仅适用于Windows并不会返回HWND_MESSAGE(至少不是我的测试).