2017-07-13 6 views
0

みなさんこんにちは。MouseInputsとKeyInputsの違いは何ですか(前景を取得するには)

SendInputsでキーを送信するだけで、ウィンドウをフォアグラウンドにするためにSetForegroundWindow()を呼び出す必要があります。これは問題なく動作します。

これで、マウス入力で同じ手順を適用することができるようになりました。しかし、これは不可能でした。まず、関数AttachThreadInput()を使用して、ウィンドウを実際にフォアグラウンドにする必要がありました。

キーで簡単に動作するのは非常に分かりませんが、マウスで行うのは面倒です。誰かがなぜこれがそうだと簡単に私に説明することができますか?

申し訳ありませんがタイトルと悪い英語、残念ながら、他の言葉は私に起こっていません。

コードが多すぎるため、私は自分の質問に関連性を示しています。

キー:

if(SetForegroundWindow(window[id])) 
{ 
//SENDINPUT for key, works without any problems. (Not with Mouse) 
} 

マウス:両方がキーの例のように動作していない理由

AttachThreadInput(dwCurID, dwMyID, TRUE); 
SetWindowPos(window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); 
SetWindowPos(window, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); 
SetForegroundWindow(window); 
AttachThreadInput(dwCurID, dwMyID, FALSE); 
//The Window is now on foreground, now use SendInput for Mouse. This way works 

だから私は本当に不思議。だから、私が知っている理由は、ウィンドウが実際にはフォアグラウンドにないからで、これはMouseInputsにとって必要です。 Keyeventsにとってもそれが必要であると思うかもしれません。それで私の混乱。

幸せな一日をお祈りします!

+0

適切なヘルプが必要な場合は、実際のコード、予想される結果、実際の結果を表示する必要があります。 –

答えて

0

質問を正しく理解していれば...はい、キーボードとマウスの入力モデルは異なります。

しかし実際の問題は、別のアプリケーションのウィンドウでSetForegroundWindowを呼び出すのが複雑だということです。フォアグラウンドウィンドウを設定できる場合とできない場合のWindowsのサイズはlong list of rulesです。 (あなたが何か他のことをしたいときに、プログラムがユーザーの顔にウィンドウを押し込むのを難しくすることが意図されています。)実際のテストでは、実際には確実に動作しない可能性があります。たとえば、現在のフォアグラウンドウィンドウがデバッガに接続されたプロセスによって所有されているかどうかによってルールの一部が異なります。私の推測では、キーボードのケースをテストしたときにあなたがラッキーだったことと、マウスのケースで作業したときにルールの周りに方法があることがわかりました。

キーボード入力は、キーボードフォーカスのあるウィンドウに向けられます。キーボードフォーカスのあるウィンドウは、フォアグラウンドウィンドウまたはフォアグラウンドウィンドウの子ウィンドウです。 SendInputを使ってキーボードメッセージを特定のアプリケーションに送るには、フォーカスがあることを確認するだけです。フォーカスはウィンドウを前面に持っていくことで可能です。

成功した場合、フォアグラウンドに移動したばかりのウィンドウは、ウィンドウのフォーカスが適切に設定されていることを確認します(たとえば、その子のSetFocusを呼び出して)。別のスレッドやプロセスに属するウィンドウでSetFocusを自分で呼び出そうとすると、マウスの場合と同じように、まずAttachThreadInputを使用する必要があります。 (これはSetFocusで説明されています)

マウス入力は、そのウィンドウがフォアグラウンドウィンドウでない場合でもマウスの下のウィンドウに(一般的に)導かれます。大きな例外は、ウィンドウがマウスを「キャプチャ」した後、マウスが別のウィンドウ上にあっても、すべてのマウス入力がそのウィンドウに移動することです。しかし、もう1つの例外はマウスのスクロールホイールメッセージで、キーボードのフォーカスが当たっているウィンドウの後ろにあるようです。

マウススクロールホイールメッセージを受け取っているのでない限り、マウス入力を送信するためにフォアグラウンドウィンドウを設定することが重要である理由がわかりません。

+0

それは私が知りたかったものです。あなたの非常に良い説明とあなたの時間のために大変ありがとうございます – Lendoria

+0

これをより正確に記述できますか? (現在のフォアグラウンドウィンドウは、デバッガに接続されたプロセスによって所有されています)。 – Lendoria

+0

私は "所有している"と言っていたはずです。私はすべてのルールを詳しく知っていません。リンクは私ができるよりもよく説明します。要点は、プログラムまたはSetForegroundWindowを呼び出そうとしているプログラムがデバッガで実行されている場合、ルールが異なることです。試してみるときは、そのことを念頭に置いておく必要があります。実際には違う方法でテストしているときに、実際に変更を加えたような変更を加えることもできます。 –

関連する問題