EnumWindowStationsW和EnumDesktopsW的使用

因为最近用到虚拟桌面做应用后台开发,创建虚拟桌面和使用模拟桌面的实现不在同一个线程里,会出现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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值