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

时间:2012-10-05 01:44:22

标签: 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)

如何找到Child-Child Window的HWND?

我尝试在FindWindow类上使用XYZ_Renderer Win32 API函数,但FindWindow函数找不到子窗口。

然后我尝试使用FindWindow查找成功的Main Window,但之后使用FindWindowEx只能查找Child Window,因为Child-Child Window不是孩子Main Window

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

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

2 个答案:

答案 0 :(得分: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... 
    }
}

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

答案 1 :(得分:5)

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

documentation表示:

  

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