0

我正在尝试在 Delphi (XE3) 中处理 OnMouseMove,即使我不移动鼠标,我也会得到源源不断的 OnMouseMove 事件,一个接一个。

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

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

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

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

难道我做错了什么?从德尔福的角度来看(即设计)这是正确的吗?WinAPI 是否正确?该怎么办?

4

1 回答 1

5

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

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

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

您会注意到表单的标题仅在您移动鼠标时发生变化。

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

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

于 2013-04-23T08:19:05.777 回答