5

如何提取窗口的所有子窗口?

示例代码:

Dim hWnd As IntPtr = ProcessName.MainWindowHandle
For Each hWndChild As IntPtr In hWnd
  MsgBox(hWndChild.classname.tostring & ", Caption: " & hWndChild.caption.tostring())
Next

(像间谍++)

4

1 回答 1

4

正如其他人所建议的那样,您应该使用EnumWindowsandEnumChildWindows函数。

这是我刚刚从我用 VB6(很久以前)编写的另一个程序的代码片段中移植的小演示程序的链接: Windows Scanner

希望能帮助到你...


编辑:我刚刚意识到这并不是一个答案,而没有实际解释这些功能是如何工作的。所以,这里是:

EnumWindows函数将一个指向回调函数的指针作为其第一个参数。第二个参数是您可以传递给回调函数的值。您可以将其视为用户定义的参数。

每次EnumWindows“找到”新窗口时,都会调用回调函数通知新窗口。此回调函数将窗口的处理程序和用户在EnumWindows第一次调用时指定的可选参数作为参数。

所以,基本上,这就是你所说的EnumWindows

EnumWindows(New EnumWindowsProc(AddressOf EnumProc), 0)

EnumWindowsProc用于创建对函数的引用的委托在哪里EnumProc,这将是我们的回调。

此类回调的签名如下:

Private Function EnumProc(hWnd As IntPtr, lParam As IntPtr) As Boolean

正是在此函数内部,您可以填充已发现窗口的内部数组。

该函数的情况几乎相同,EnumChildWindows唯一的区别是它的第一个参数必须是父窗口的处理程序。其他一切都以完全相同的方式处理。

如果您查看WindowsScanner程序的源代码,您会发现我什至对 和 使用了相同的委托和相同的回调EnumWindows函数EnumChildWindows。那么我怎么知道我们是在枚举顶级窗口还是子窗口呢?很简单,我只是将最后一个参数设置EnumChildWindows为“1”。然后,这个参数被传递给回调函数 ( EnumProc),它允许它根据该参数的值采取不同的操作。

于 2013-01-18T22:53:43.233 回答