0

Delphi (XE3) で OnMouseMove を処理しようとしていますが、マウスを動かさなくても、次々と OnMouseMove イベントの無限のストリームが発生します。

元。: 新しい VCL フォーム アプリケーションを開始します。次のコードを使用して、OnMouseMove ハンドラーをフォームに追加します。

var s: string;
begin
  s := IntToStr(GetTickCount()) + ': MouseMove';
  OutputDebugString(PChar(s));
end;

マウスをフォームの上に置き、IDE のメッセージ ログで無限の OnMouseMoves を観察します。

MouseMove メッセージが届くのは、実際にカーソルを動かしたとき (および、その他の例外的な状況のとき) だけだと思います。実際、私は常に OnMouseMove がこのように機能すると考えてきました。

私は何か間違ったことをしていますか?これは、Delphi の観点から (つまり、設計上) 正しいですか? これは WinAPI で正しいですか? それについて何をすべきか?

4

1 に答える 1

5

これは、Delphi デバッガのOutputDebugString. OnMouseMoveしかし、あなたの診断は、実際のプログラムでメッセージが実際にどのように到着するかを反映していません。

たとえば、プログラムの次のバリアントを考えてみましょう。

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; 
  X, Y: Integer);
begin
  Caption := IntToStr(GetTickCount()) + ': MouseMove';
end;

マウスを動かしたときにのみ、フォームのキャプションが変化することに気付くでしょう。

または、プログラムを取得して、別のデバッグ文字列モニターを使用します。たとえば、DbgViewSysInternals から。その外部デバッグ文字列モニターを使用すると、マウスが実際に動いたときにのみデバッグ メッセージが到着することがわかります。

Delphi デバッガーが何を行っているのか、あなたが観察した動作につながるのかわかりません。ただし、OnMouseMove実際のプログラムのメッセージは、マウスが実際に動いている場合にのみ到着することに注意してください。

于 2013-04-23T08:19:05.777 に答える