OnMouseMove事件无休止地到达



我试图在Delphi (XE3)中处理OnMouseMove,即使我不移动鼠标,我也会得到OnMouseMove事件的无尽流,一个接一个。

交货。:启动新的VCL表单应用程序。用下面的代码给表单添加OnMouseMove处理程序:

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

将鼠标放置在窗体上,观察IDE的消息日志中无尽的OnMouseMoves。

我希望MouseMove消息只在我实际移动光标时到达(可能在一些其他特殊情况下)。事实上,我一直认为OnMouseMove是这样工作的。

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

这只是与Delphi调试器处理OutputDebugString的交互。但是您的诊断并不能反映OnMouseMove消息在实际程序中是如何到达的。

例如,考虑你的程序的这个变体:

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

你会注意到表单的标题只有在你移动鼠标的时候才会改变。

或者使用您的程序,并使用不同的调试字符串监视器。例如SysInternals中的DbgView。使用外部调试字符串监视器,您会发现调试消息只有在鼠标真正移动时才会到达。

我不确定Delphi调试器正在做什么导致你观察到的行为。但是,请确保实际程序中的OnMouseMove消息只有在鼠标真正移动时才会到达。

我可以添加一个提示,OnMouseMove事件也会在控件上显示提示时无休止地到达。

我发现了一个困难的方法:当鼠标移动到ListBox的每个元素上时,我试图显示一个提示,显示有关该元素的一些"额外"信息。

只要我调用HintWindow.ActivateHint(...,HintWindow.Hint);, OnMouseMove就会被触发。

由于在OnMouseMove内部要做的第一件事是释放并重新创建hintwwindow,提示闪烁很多,因为OnMouseMove事件永无止境地到达。

如果我在。activatehint之前设置OnMouseMove为Nil,闪烁结束,不再有OnMouseMove事件到达。

现在我正试图"保存"事件到一个变量和恢复后。activatehint,但我不知道如何做到这一点,什么效果会有…保存OnMouseLeave很容易,但是OnMouseMove会引发编译错误。

最新更新