【发布时间】:2015-01-08 13:47:35
【问题描述】:
我创建了一个小程序,它可以在新桌面上自行启动。
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);
...
所以基本上桌面 DEFAULT 上的应用程序 A 是在桌面 X 上启动应用程序 B,它获得另一个应用程序 C 在同一个桌面 X 上启动的 HWND。
我的问题是来自桌面 X 上的应用程序 B 的键盘事件不会在应用程序 C 中触发。只有当我使用SwitchDesktop(B) 时,才会触发事件并正确执行代码。
我错过了什么?
【问题讨论】:
标签: c++ winapi window-messages