新しいデスクトップで起動する小さなプログラムを作成しました。
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 上のアプリケーションは、デスクトップ X でアプリケーションを開始し、同じデスクトップ X で開始されたB
別のアプリケーションへの HWND を取得します。C
B
私の問題は、デスクトップ Xのアプリケーションからのキーボード イベントがアプリケーションでトリガーされないことですC
。を使用した場合にのみSwitchDesktop(B)
、イベントがトリガーされ、コードが適切に実行されます。
私は何が欠けていますか?