fam*_*amf 5 .net vb.net pinvoke winforms
如何提取窗口的所有子窗口?
示例代码:
Dim hWnd As IntPtr = ProcessName.MainWindowHandle
For Each hWndChild As IntPtr In hWnd
MsgBox(hWndChild.classname.tostring & ", Caption: " & hWndChild.caption.tostring())
Next
Run Code Online (Sandbox Code Playgroud)
(像间谍++)
正如其他人所建议的那样,您应该使用EnumWindows和EnumChildWindows函数。
下面是一个小演示程序的链接,我刚刚从我用 VB6 编写的另一个程序(很久以前)的代码片段移植过来: Windows Scanner
希望能帮助到你...
编辑:我刚刚意识到这并不是一个答案,而没有实际解释这些功能是如何工作的。所以,事情是这样的:
该EnumWindows函数将指向回调函数的指针作为其第一个参数。第二个参数是可以传递给回调函数的值。您可以将其视为用户定义的参数。
每次EnumWindows“发现”新窗口时,它都会调用回调函数来通知新窗口。该回调函数将窗口的处理程序和用户EnumWindows首次调用时指定的可选参数作为参数。
所以,基本上,这就是你的调用方式EnumWindows:
EnumWindows(New EnumWindowsProc(AddressOf EnumProc), 0)
Run Code Online (Sandbox Code Playgroud)
哪里EnumWindowsProc有一个委托用于创建对EnumProc函数的引用,这将是我们的回调。
该回调的签名如下:
Private Function EnumProc(hWnd As IntPtr, lParam As IntPtr) As Boolean
Run Code Online (Sandbox Code Playgroud)
您可以在该函数内填充已发现窗口的内部数组。
该函数的情况几乎相同EnumChildWindows,唯一的区别是它的第一个参数必须是父窗口的处理程序。其他一切都以完全相同的方式处理。
如果您检查程序的源代码WindowsScanner,您会发现我什至对 和 都使用相同的委托和相同的回调EnumWindows函数EnumChildWindows。那么我怎么知道我们是在枚举顶级窗口还是子窗口呢?很简单,我只需将 的最后一个参数设置EnumChildWindows为“1”即可。然后,该参数被传递给回调函数 ( EnumProc),该函数允许回调函数根据该参数的值采取不同的操作。
| 归档时间: |
|
| 查看次数: |
3765 次 |
| 最近记录: |