OnMouseMove活动应该无休止地到来吗?

时间:2013-04-23 08:09:52

标签: delphi

我正在尝试在Delphi(XE3)中处理OnMouseMove,即使我不移动鼠标,我也会一个接一个地获得无休止的OnMouseMove事件。

例如:启动新的VCL表单应用程序。使用以下代码将OnMouseMove处理程序添加到表单:

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

将鼠标放在表单上,​​在IDE的消息日志中观察无尽的OnMouseMoves。

我希望MouseMove消息只在我实际移动光标时到达(并且可能在其他一些特殊情况下)。事实上,我总是以OnMouseMove的方式工作。

我做错了吗?从Delphi的角度来看这是正确的(即通过设计)吗? WinAPI这是正确的吗?该怎么办?

1 个答案:

答案 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消息只有在鼠标真正移动时才会到达。