Microsoft WinAPI文档似乎build议user32.dll包含一个名为GetNextWindow()
的函数,据称允许通过重复调用此函数来枚举打开的窗口,以其Z顺序。
Pinvoke通常会给我必要的DllImport
语句来使用C#中的WinAPI函数。 但是,对于GetNextWindow()
它没有条目。 所以我试图构build自己的:
[DllImport("user32.dll")] static extern IntPtr GetNextWindow(IntPtr hWnd, uint wCmd);
不幸的是,当试图调用这个时,我得到一个EntryPointNotFoundException
:
Unable to find an entry point named 'GetNextWindow' in DLL 'user32.dll'.
这似乎只适用于GetNextWindow()
; Pinvoke上列出的其他function都没有问题。 我可以调用GetTopWindow()
和GetWindowText()
而不会引发exception。
当然,如果你可以build议一个完全不同的方式来枚举当前的Z顺序的窗口,我也很高兴听到这一点。
GetNextWindow()实际上是GetWindow()的一个宏,而不是实际的API方法。 这是为了与Win16 API向后兼容。
[DllImport("user32.dll", SetLastError = true)] static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd); enum GetWindow_Cmd : uint { GW_HWNDFIRST = 0, GW_HWNDLAST = 1, GW_HWNDNEXT = 2, GW_HWNDPREV = 3, GW_OWNER = 4, GW_CHILD = 5, GW_ENABLEDPOPUP = 6 }
(来自Pinvoke.net )
GetNextWindow是一个调用GetWindow的c ++宏,所以你不能从.NET调用它。 改为调用GetWindow。
来自MSDN :
使用此函数与设置了GW_HWNDNEXT或GW_HWNDPREV标志的GetWindow函数相同