如何在C#中使用GetNextWindow()?

时间:2009-04-28 14:33:38

标签: c# windows winapi

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顺序的窗口,我也很高兴听到这一点。

2 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:2)

GetNextWindow是一个调用GetWindow的c ++宏,所以你不能从.NET调用它。改为调用GetWindow。

来自MSDN

  

使用此函数与使用GW_HWNDNEXT或GW_HWNDPREV标志设置调用GetWindow函数相同