web-dev-qa-db-ja.com

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

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

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

24
SlipToFall

申し訳ありませんが、これは確かに残念なことですが、100%の信頼性では基本的にこれを行うことはできません

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

つまり、 SendMessageWM_KEYUPWM_CHAR 、および WM_KEYDOWN メッセージおよび(それらを受信するWndProcに応じて) )多分それを回避します。しかし、覚えておいてください 壊れそうです 状況によっては、期間。

31
Kevin Montrose

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

6
Remy Lebeau

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

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

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

WM_CHARもかなり一般的です

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

1
Anthony Bachler