因为最近用到虚拟桌面做应用后台开发,创建虚拟桌面和使用模拟桌面的实现不在同一个线程里,会出现FindWindowA找不到应用的情况。在百度上找了好久,没有找到使用例子,我是这样实现的
一、枚举出所有的桌面
二、把桌面的句柄放在一个vector中
三、遍历桌面句柄的vector,每次遍历都SetThreadDesktop设置当前线程的桌面,然后调用FindWindowA
部分参考代码
BOOL WINAPI TopLevelEnum(HWND hwnd, LPARAM lParam)
{
//EnumChildWindows(hwnd, &EnumProc, lParam);
return TRUE;
}
BOOL CALLBACK DeskEnum(LPWSTR desk, LPARAM lParam)
{
HDESK hDesk = OpenDesktopW(desk, 0, FALSE, DESKTOP_READOBJECTS | DESKTOP_ENUMERATE);
if (hDesk)
{
HDESK hCurrentDesk = GetThreadDesktop(GetCurrentThreadId());
//SetThreadDesktop(hDesk);
EnterCriticalSection(&g_csTerm2);
vDesktop.push_back(hDesk);
LeaveCriticalSection(&g_csTerm2);
//EnumDesktopWindows(hDesk, &TopLevelEnum, lParam);
//SetThreadDesktop(hCurrentDesk);
//CloseDesktop(hDesk);
}
return TRUE;
}
BOOL CALLBACK EnumWinStationProc(LPTSTR winsta, LPARAM lParam)
{
/* store the lpszDesktop in list */
HWINSTA current = GetProcessWindowStation();
HWINSTA hWinsta = OpenWindowStationW(winsta, FALSE, WINSTA_ENUMDESKTOPS);
if (hWinsta)
{
//SetProcessWindowStation(hWinsta);
EnumDesktopsW(hWinsta, &DeskEnum, lParam);
//SetProcessWindowStation(current);
//CloseWindowStation(hWinsta);
}
return true;
}
int count = 0;
EnumWindowStationsW(&EnumWinStationProc, (LPARAM)&count);
因为桌面句柄的vector需要在线程里面使用,而EnumWindowStationsW这个函数是在主线程调用,所以加了临界区。
在线程函数里面的参考代码:
HWND hWnd = 0;
EnterCriticalSection(&g_csTerm2);
for (vector<HDESK>::iterator iDesktop = vDesktop.begin(); iDesktop != vDesktop.end(); iDesktop++)
{
SetThreadDesktop(*iDesktop);
Sleep(200);
hWnd = FindWindowA("xxxx", "xxx");
if (hWnd)
break;
}
LeaveCriticalSection(&g_csTerm2);