c++ - 为什么 FindWindow 找到了 EnumChildWindows 找不到的窗口?

标签 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返回。

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

最佳答案

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

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

  1. 如果 hwndParenthwndChildAfter 都为 NULL。
  2. 如果您指定“HWND_MESSAGE”作为您的父窗口。

此代码将为您找到所有相关窗口(来自 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(至少不会用于我的测试)。

关于c++ - 为什么 FindWindow 找到了 EnumChildWindows 找不到的窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9518307/

相关文章:

c++ - 在 MSVC ABI 中,如何可靠地找到仅给出 (void*) 的 vtable?

c++ - 如何使用int指针?

python - 对 cxfreeze windows 可执行文件进行数字签名?

windows - 令人沮丧的处理窗口消息(WM_XX)

c++ - 初始化列表中的抽象类init

C++ : Modifying a timer

windows - Docker Compose说$ PWD变量未设置Windows

windows - 如何将日期附加到 xcopy 中的目录路径

c# - 如何判断主音量是否静音?

c - 窗口服务: get each users' %APPDATA% variable