Как использовать GetNextWindow () в C#?

документация Microsoft WinAPI, похоже, предполагает, что user32.dll содержит функцию с именем GetNextWindow() который предположительно позволяет перечислять открытые окна в порядке Z, вызывая эту функцию повторно.

вызов PInvoke обычно дает мне необходимые DllImport оператор для использования функций WinAPI из C#. Однако для 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 ответов


GetNextWindow() - это на самом деле макрос GetWindow(), а не фактический метод API. Это для обратной совместимости с API Win16.

[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-это макрос c++, который вызывает GetWindow, поэтому вы не можете вызвать его .Сеть. Вместо этого позвоните в GetWindow.

с MSDN:

использование этой функции равносильно вызову функции GetWindow с флагом gw_hwndnext или gw_hwndprev set