6

新しいデスクトップで起動する小さなプログラムを作成しました。

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)、イベントがトリガーされ、コードが適切に実行されます。

私は何が欠けていますか?

4

1 に答える 1

7

物理コンソール (画面、マウス、キーボード) でアクティブではないデスクトップでユーザー入力をシミュレートしようとしていますが、これは機能しない可能性が高く、なぜSwitchDesktop()機能するのですか? ドキュメントによると:

SwitchDesktop 機能

指定したデスクトップを表示してアクティブにします。これにより、デスクトップはユーザーからの入力を受け取ることができます。

keybd_event()mouse_event()SendInput()、それらはすべて、入力メッセージを生成して、物理的なマウス/キーボードがメッセージをポストするのと同じ入力キューに格納するだけです。入力システムは、入力メッセージをアプリケーションにディスパッチするときに、ユーザー入力と合成入力の違いを認識しません。

Raymond Chen はブログで次のように述べています。

SendInput を使用せずに入力をシミュレートするにはどうすればよいですか?

SendInput は、入力スタックの最下位レベルで動作します。これは、ユーザーが入力を生成したことをウィンドウ マネージャーに伝えるためにキーボードとマウスのドライバーが使用するのと同じ入力メカニズムへの単なるバックドアです。SendInput 関数は、入力に何が起こるかを知りません。これは、メッセージが最初にどのウィンドウに配信されるかを確認するためにマウス入力のヒット テストを行うコンポーネントのように、ウィンドウ マネージャーのより高いレベルで処理されます。

SendInput()彼はまた、別のブログ記事に、入力キューに関連して s がどこに位置するかを示す素敵な小さな図を投稿しました。

何かがキューに追加されると、キューの先頭に出るまでに時間がかかります

ダイアグラム

于 2015-01-08T18:08:14.127 に答える