正如其他人所建议的那样,您应该使用EnumWindows
and EnumChildWindows
功能。
下面是一个小演示程序的链接,我刚刚从我用 VB6 编写的另一个程序(很久以前)的代码片段移植过来:Windows 扫描仪 http://software.xfx.net/stackoverflow/WindowsScanner.zip
希望能帮助到你...
Edit:我刚刚意识到,在没有实际解释这些功能如何工作的情况下,这并不是一个很好的答案。所以,事情是这样的:
The EnumWindows
函数将指向回调函数的指针作为其第一个参数。
第二个参数是可以传递给回调函数的值。您可以将其视为用户定义的参数。
每次EnumWindows
“发现”一个新窗口,它会调用回调函数来通知新窗口。该回调函数将窗口的处理程序和用户指定的可选参数作为参数EnumWindows
第一次被称为。
所以,基本上,这就是你的调用方式EnumWindows
:
EnumWindows(New EnumWindowsProc(AddressOf EnumProc), 0)
Where EnumWindowsProc
是一个委托,用于创建对EnumProc
函数,这将是我们的回调。
该回调的签名如下:
Private Function EnumProc(hWnd As IntPtr, lParam As IntPtr) As Boolean
您可以在该函数内填充已发现窗口的内部数组。
事情几乎是一样的EnumChildWindows
函数,唯一的区别是它的第一个参数必须是父窗口的处理程序。
其他一切都以完全相同的方式处理。
如果你检查源代码WindowsScanner
程序中,您会看到我什至对两者使用相同的委托和相同的回调函数EnumWindows
and EnumChildWindows
。
那么我怎么知道我们是在枚举顶级窗口还是子窗口呢?
很简单,我只需设置最后一个参数EnumChildWindows
到“1”。然后,这个参数被传递给回调函数(EnumProc
)这允许它根据该参数的值采取不同的操作。