要枚举Windows当前所有打开的顶层窗口,可使用Windows API函数EnumWindows():
BOOL EnumWindows( WNDENUMPROC lpEnumFunc, LPARAM lParam);
具体使用方法如下所示(将指定ProcessID的进程对应窗口置于前台):
BOOL CALLBACK EnumWindows_SetForegruond_Proc(HWND hwnd, LPARAM lParam)
{
DWORD dwPID = 0;
GetWindowThreadProcessId(hwnd, &dwPID);
if(dwPID == (DWORD)lParam)
{
::SetForegroundWindow(hwnd);
::ShowWindow(hwnd, SW_SHOWNORMAL);
return FALSE;
}
return TRUE;
}//~End of EnumWindows_SetForegruond_Proc()
......
//以下hProcess为指定窗口的进程句柄HANDLE
DWORD dwPID = GetProcessId(hProcess);
EnumWindows(EnumWindows_SetForegruond_Proc, dwPID);
但是使用上面方法似乎也有个小问题。例如我的HANDLE是通过执行ShellExecuteEx(...)获得的,上面代码虽然执行了EnumWindows_SetForegruond_Proc(),但是并没有将窗口置于前台(好像是因为找不到值为dwPID的进程ID)?而在调试模式下,再执行调用 EnumWindows(EnumWindows_SetForegruond_Proc, dwPID)之前加入一个断点,一步一步执行,操作就成功了!为何?问题待解决ing......