我创建了一个小程序,它在新桌面中启动。
HDESK hDesktop = ::CreateDesktop(strDesktopName.c_str(),
NULL, // Reserved
NULL, // Reserved
0, // DF_ALLOWOTHERACCOUNTHOOK
GENERIC_ALL,
NULL); // lpSecurity
::SetThreadDesktop(hDesktop);
稍后,使用以下行在该桌面上启动另一个应用程序:
PROCESS_INFORMATION pi = { 0 };
STARTUPINFO si = { 0 };
si.cb = sizeof(si);
si.lpDesktop = &strDesktop[0];
if (FALSE == ::CreateProcess(pathModuleName.file_string().c_str(), L"abc def", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
return false;
DWORD dwWaitRes = ::WaitForSingleObject(pi.hProcess, INFINITE);
pathModuleName
是由 获得的自身位置GetModuleFileName(NULL)
。
新创建的应用程序获取到另一个窗口的 HWND 并使用以下命令发送窗口消息:
// bring window to front
::SetForegroundWindow(hwnd);
// set focus so keyboard inputs will be caught
::SetFocus(hwnd);
::keybd_event(VK_MENU, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
...
所以基本上A
桌面 DEFAULT 上的应用程序是B
在桌面 X 上启动应用程序,它会获得一个 HWND 到C
在同一个桌面 X 上启动的另一个应用程序。
我的问题是来自B
桌面 X 上的应用程序的键盘事件没有在应用程序中触发C
。只有当我使用SwitchDesktop(B)
时,才会触发事件并正确执行代码。
我错过了什么?