EnumWindows枚举屏幕上的所有顶层窗口,不包括子窗口
BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);
第一个参数是WNDENUMPROC类型的回调函数,每个枚举窗口都会被调用一次,而且会把窗口的句柄作为参数传给该回调函数,如果该回调函数返回FALSE则停止枚举
第二个参数可以传入我们自定义的数据,这里传入一个包含进程号和窗口句柄的结构,进程号假设已经获取到,在找到该进程号对应的窗口时将窗口句柄赋值给该结构的句柄变量
回调函数的形式
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
第一个参数为窗口句柄,第二个参数是传给EnumWindows的lParam参数
struct ProcessWindowData
{
HWND hWnd;
unsigned long lProcessId;
};
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
ProcessWindowData& wndData = *(ProcessWindowData*)lParam;
unsigned long lProcessId = 0;
::GetWindowThreadProcessId(hWnd, &lProcessId);
if ((wndData.lProcessId != lProcessId) || (::GetWindow(hWnd, GW_OWNER) != (HWND)0) || !::IsWindowVisible(hWnd))
{
return TRUE;
}
wndData.hWnd = hWnd;
return FALSE;
}
HWND GetMainWindowHwnd(unsigned long lProcessId)
{
ProcessWindowData wndData;
wndData.hWnd = 0;
wndData.lProcessId = lProcessId;
::EnumWindows(EnumWindowsProc, (LPARAM)&wndData);
return wndData.hWnd;
}
如果要枚举指定桌面的窗口可以使用EnumDesktopWindows