Microsoft WinAPI文档似乎建议user32.dll包含一个名为 GetNextWindow() 的函数,该函数应该允许它通过重复调用此函数以Z顺序枚举打开的窗口。

Pinvoke通常会给我必要的DllImport语句,以使用C#中的WinAPI函数。但是,对于GetNextWindow(),它没有条目。所以我试图构造自己的:

[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上列出的其他功能也可以。我可以在不引发异常的情况下调用GetTopWindow()GetWindowText()

当然,如果您可以提出一种完全不同的方式来按当前的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)

10-06 10:23