如何使用Win32 API查找子窗口(3级深)的子窗口的子HWND?

bod*_*ydo 4 api winapi findwindow findwindowex

假设我为其中一个进程设置了这个Window层次结构:

Main Window               (class name: XYZ_Widget_1)
`- Child Window           (class name: XYZ_Widget_0)
  `- Child-Child Window    (class name: XYZ_Renderer)
Run Code Online (Sandbox Code Playgroud)

我如何找到HWND Child-Child Window

我尝试FindWindowXYZ_Renderer类上使用Win32 API函数,但该FindWindow函数找不到子窗口.

然后我试图使用FindWindow发现Main Window,它成功了,但使用后FindWindowEx只能找到Child Window作为Child-Child Window是不是一个孩子Main Window.

我想我可以更深入一层并在Child Window找到它之后调用FindWindowEx .

但在我这样做之前,我想可能有一个简单的方法可以找到Child-Child Window

Rem*_*eau 9

您必须为FindWindowEx()要关闭的每个子级别调用HWND,将前一级别中的找到指定为父级别,例如:

HWND hWnd = FindWindow("XYZ_Widget_1", NULL);
if (hWnd != NULL)
{
    hWnd = FindWindowEx(hWnd, NULL, "XYZ_Widget_0", NULL);
    if (hWnd != NULL)
    {
        hWnd = FindWindowEx(hWnd, NULL, "XYZ_Renderer", NULL);
        // and so on... 
    }
}
Run Code Online (Sandbox Code Playgroud)

没有简单的方法可以做到这一点.为了简化代码,您可以编写自己的函数,接受类/窗口名称的路径作为输入,循环遍历它FindWindow/Ex(),根据需要调用每个分支.


Dav*_*nan 5

调用EnumChildWindows传递父窗口为hwndParent.您的窗口是类名等于的窗口XYZ_Renderer.

文件指出:

如果子窗口创建了自己的子窗口,EnumChildWindows也会枚举这些窗口.