【发布时间】:2009-06-23 14:31:51
【问题描述】:
是否有 Win32 API 方法来获取所有打开的窗口的枚举?似乎肯定只是不确定从哪里开始寻找。
【问题讨论】:
是否有 Win32 API 方法来获取所有打开的窗口的枚举?似乎肯定只是不确定从哪里开始寻找。
【问题讨论】:
EnumWindows() 就是为了这个。您调用它并提供回调。它为每个找到的窗口调用回调并将句柄传递给该窗口。
然后您可以使用句柄来查询窗口参数并决定您是否感兴趣或对它执行一些操作。
【讨论】:
您需要在 user32.dll 中使用 EnumDesktopWindows 函数。
这里有一些 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;
}
【讨论】: