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

How come FindWindow finds a window that EnumChildWindows doesn't?

本文关键字:EnumChildWindows 一个 窗口 FindWindow 为什么      更新时间:2023-10-16

我正在寻找一个类名为"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返回。

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

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);
}

还要注意的是,与上面链接中所写的不同,仅消息窗口的GetParent()不会返回HWND_MESSAGE(至少对于我的测试来说不是)。

枚举所有仅消息窗口的简单方法:

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

//GetAncestor(FindWindowEx(HWND_MESSAGE,0,0,0),GA_PARENT)="GetMessageWindow"(类"MESSAGE")

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

相关文章:
  • 没有找到相关文章