Перечислите все дескрипторы окна на рабочем столе

Есть ли способ Win32 API для получения перечисления всех открытых окон? Похоже, должно быть, просто не знаю, с чего начать.

3 ответа

Решение

EnumWindows() для этого. Вы звоните и предоставляете обратный звонок. Он вызывает обратный вызов для каждого найденного окна и передает дескриптор этому окну.

Затем вы можете использовать дескриптор, чтобы запросить параметры окна и решить, представляет ли он интерес для вас или выполнить какое-либо действие с ним.

Вы захотите использовать функцию EnumDesktopWindows в user32.dll.

Вот код C#, чтобы вы указали на правильные вызовы API. Я не уверен, как это будет выглядеть в C, но вы поняли идею.

[DllImport("user32.dll")]
private static extern int EnumDesktopWindows(IntPtr hDesktop, EnumWindowsProc ewp, int lParam);

Я подумал, что пример может пролить больше света на процесс

#include <windows.h>

BOOL CALLBACK printVisibleWindows(HWND wnd, LPARAM lParam)
{
    if(!IsWindowVisible(wnd))return 1;
    int length = GetWindowTextLength(wnd);
    if(!length)return 1;
    length++;
    TCHAR *buffer = (TCHAR*)malloc(length);
    GetWindowText(wnd, buffer, length);
    printf("%p %s\n", wnd, buffer);
    free(buffer);
    return 1;
}

int main()
{
    DWORD dwThreadId = GetCurrentThreadId();
    HDESK hDesktop = GetThreadDesktop(dwThreadId);
    EnumDesktopWindows(hDesktop, printVisibleWindows, 0);
    return 0;
}
Другие вопросы по тегам