我正在尝试在Delphi(XE3)中处理OnMouseMove,即使不移动鼠标,我也会无休止地收到OnMouseMove事件流。
例如 :启动新的VCL表单应用程序。使用以下代码将OnMouseMove处理函数添加到表单中:
var s: string;
begin
s := IntToStr(GetTickCount()) + ': MouseMove';
OutputDebugString(PChar(s));
end;
Run Code Online (Sandbox Code Playgroud)
将鼠标放在窗体上,在IDE的“消息”日志中观察无尽的OnMouseMoves。
我希望MouseMove消息仅在我实际移动光标时才会到达(也许在其他一些特殊情况下)。实际上,尽管OnMouseMove总是这样工作的。
难道我做错了什么?从Delphi的角度来看(即通过设计),这是否正确?WinAPI正确吗?怎么办呢?
这只是与Delphi调试器对的处理进行的交互OutputDebugString。但是您的诊断并不能反映OnMouseMove消息实际上是如何到达真实程序的。
例如,考虑程序的以下变体:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
Caption := IntToStr(GetTickCount()) + ': MouseMove';
end;
Run Code Online (Sandbox Code Playgroud)
您会注意到,仅当您移动鼠标时,表格的标题才会更改。
或使用您的程序,并使用其他调试字符串监视器。例如,DbgView来自SysInternals。使用该外部调试字符串监视器,您会发现调试消息仅在鼠标真正移动时到达。
我不确定Delphi调试器在做什么,从而导致您观察到的行为。但是,请确保OnMouseMove只有在鼠标确实在移动时,实际程序中的消息才会到达。
| 归档时间: |
|
| 查看次数: |
359 次 |
| 最近记录: |