我正在尝试在Delphi(XE3)中处理OnMouseMove,即使我不移动鼠标,我也会一个接一个地获得无休止的OnMouseMove事件。
例如:启动新的VCL表单应用程序。使用以下代码将OnMouseMove处理程序添加到表单:
var s: string;
begin
s := IntToStr(GetTickCount()) + ': MouseMove';
OutputDebugString(PChar(s));
end;
将鼠标放在表单上,在IDE的消息日志中观察无尽的OnMouseMoves。
我希望MouseMove消息只在我实际移动光标时到达(并且可能在其他一些特殊情况下)。事实上,我总是以OnMouseMove的方式工作。
我做错了吗?从Delphi的角度来看这是正确的(即通过设计)吗? WinAPI这是正确的吗?该怎么办?
答案 0 :(得分:4)
这只是与Delphi调试器对OutputDebugString
的处理的交互。但是,您的诊断并未反映OnMouseMove
消息实际到达实际程序的方式。
例如,请考虑您的程序的这个变体:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
Caption := IntToStr(GetTickCount()) + ': MouseMove';
end;
您会注意到,只有在移动鼠标时,表单的标题才会更改。
或者使用您的程序,并使用不同的调试字符串监视器。例如,来自SysInternals的DbgView
。使用该外部调试字符串监视器,您会发现调试消息仅在鼠标真正移动时到达。
我不确定Delphi调试器正在做什么导致您观察到的行为。但是,请确保实际程序中的OnMouseMove
消息只有在鼠标真正移动时才会到达。