Перечислите все дескрипторы окна на рабочем столе
Есть ли способ 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;
}