Windows APIを使用してアクティブにせずにキーストロークをウィンドウに送信するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1220820

質問

    アクティブ化されたウィンドウにコマンドを送信するアプリケーションを既に作成しました。プロセスの実行中にコンピューターを使用できるようにしたいのは、フォーカスを別のウィンドウに切り替えるとすぐに、送信キーを介して送信されるキーストロークが切り替えたばかりのウィンドウに移動するためです。

    現在、Windows APIのFindWindow、IsIconic、ShowWindowを使用しています。ウィンドウがFindWindowにあるかどうかを確認し、その呼び出しで返される特定のウィンドウにオブジェクトを設定し、IsIconicで最小化されているかどうかを確認し、ShowWindowがあれば呼び出し、最後に呼び出す必要がありますInteraction.AppActivateを使用して、そのウィンドウにフォーカスを設定します。これらはすべて、キーストロークを送信する前に行われます。ウィンドウを表示してアクティブにせずに、キーストロークを送信する方法があるはずです。大きなことは、私のアプリケーションがキーストロークを実行している間、コンピューターで何もできないことです。

役に立ちましたか?

解決

さて、これはちょっと残念ですが、あなたは基本的に100%の信頼性でこれを行うことはできません

Windowsは、アクティブなウィンドウがキーボード入力を受け取るウィンドウであると想定します。キーボード入力を偽造する適切な方法は、 SendInput を使用することです。 、アクティブなウィンドウにのみメッセージを送信することがわかります。

言われていることは、 SendMessage WM_KEYUP WM_CHAR 、および WM_KEYDOWN メッセージおよび(それらを受信するWndProcに応じて)回避することができます。ただし、状況によっては壊れることを忘れないでください。期間。

他のヒント

keybd_event()またはSendInput()を使用しているように聞こえます。どちらも現在アクティブなウィンドウにキーストロークを送信します。そのwidnowがフォーカスされているかどうかに関係なく、キーストロークを特定のウィンドウに送るには、まずそのHWNDハンドルを見つけてから、適切にフォーマットされたWM_KEYUP / DOWNおよびWM_CHARメッセージを直接送信する必要があります。

ウィンドウHWNDがあれば、WM_KEYDOWNおよびWM_KEYUPメッセージをメッセージキューに直接SendMessage()できます。ウィンドウはアクティブである必要はありません。

ただし、これはターゲットアプリケーションがキーボード入力を処理する方法に依存することを理解してください。それを処理する方法はいくつかあります。

WM_KEYUP / WM_KEYDOWNが最も一般的で、一部のアプリケーションはどちらか一方のみを処理します(通常はWM_KEYDOWN)。

WM_CHARもかなり一般的です

一部のプログラムは、GetAsyncKeyState、GetKeyState、またはGetKeyboardStateを使用します。これは非常に珍しいことですが、SendMessage()によるキー入力の注入を効果的に防ぎます。この場合、キーボードドライバーによって直接処理されるkeybd_event()にフォールバックします。もちろん、ウィンドウはアクティブでなければなりません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top