4

イベントNumericUpDownsを処理して現在のマウス座標で2 つを更新するカスタム コントロールがあります。MouseMove

ただし、イベントが発生してはならない場合でもイベントが発生するという奇妙なケースを経験しましたMouseMove(ワイヤレス マウスをオフにし、トラックパッドを無効にしました)。そのためMouseMove、マウスが動かなくても発生します。

簡単なチェックを行い、これらの「ゴースト」MouseMoveイベント間でマウス ポインターの位置が変わらないことを確認しました。これを利用して、イベントを処理するメソッドがポインターが実際に移動したときにのみ呼び出されるようにしたので、アプリケーションの要件を満たすことができました。

ただし、すべてのマウス/トラックパッドが無効になっているときに MouseMove イベントを発生させるものがわからないため、まだ困惑しています。Visual Studio のコール スタックを見ると、MouseMoveイベントの発生は、まるでマウスが実際に動いたかのように "本物" であるように思えますMouseMove。 .

この理由について何か提案はありますか?ありがとうございました!

MouseMove編集:キングキングの提案に従って、メッセージが検出されるたびに文字列を出力するようにコードを変更しました。マウスがオフでポインターがコントロールの上にあるときに、Alt-Tab キーを押してアプリケーションを切り替えると、文字列が出力されることに気付きました。おそらく、これはアプリケーションが再描画されたことと関係がありますか?

4

1 に答える 1

5

Windows は、偽の WM_MOUSEMOVE メッセージを合成することがあります。これは特に、あるウィンドウから別のウィンドウにフォーカスが変更されたときに発生します。フォーカスを取得したウィンドウは、move メッセージも取得します。Alt+Tab を使用したときにこれが発生するのを見ることは、これが実際にメッセージのソースであるという優れたリードです。

これはすべて完全に意図的なものです。これにより、WM_MOUSEMOVE によってトリガーされる他の一連のメッセージが確実に発生します。特に WM_NCHITTEST と WM_SETCURSOR。正しいマウス カーソルの形状が表示されるようにします。それ以外の場合は、Winforms で Control.Cursor および Application.UseWaitCursor プロパティによって影響を受けます。

あなたはこれと一緒に暮らす必要があります.これが決して問題にならないようにしてください.

于 2013-10-07T13:10:30.023 に答える