如何提取窗口的所有子窗口?提取窗口的所有子窗口
示例代码:
Dim hWnd As IntPtr = ProcessName.MainWindowHandle
For Each hWndChild As IntPtr In hWnd
MsgBox(hWndChild.classname.tostring & ", Caption: " & hWndChild.caption.tostring())
Next
(如间谍++)
如何提取窗口的所有子窗口?提取窗口的所有子窗口
示例代码:
Dim hWnd As IntPtr = ProcessName.MainWindowHandle
For Each hWndChild As IntPtr In hWnd
MsgBox(hWndChild.classname.tostring & ", Caption: " & hWndChild.caption.tostring())
Next
(如间谍++)
正如其他人所说,你应该使用EnumWindows
和EnumChildWindows
功能。
下面是我刚刚从一段代码移植从我在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
),该函数允许其根据该参数的值采取不同的操作。
使用EnumChildWindows()。 –
谢谢:)我会试试看。 – famf
Windows或控件? –