我试图在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会引发编译错误。