2013-04-23 19 views
0

我想在Delphi(XE3)中處理OnMouseMove,並且即使當我不移動鼠標時,我也會一個接一個地獲得無盡的OnMouseMove事件流。OnMouseMove事件應該無休止地到達嗎?

Ex。:啓動新的VCL Forms應用程序。的OnMouseMove處理程序添加到窗體與此代碼:

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

將鼠標放在形式,觀察無盡OnMouseMoves在IDE的信息日誌。

我希望MouseMove消息只在實際移動光標時纔會到達(也可能在其他特殊情況下)。事實上,儘管OnMouseMove一直都是這樣工作的。

我做錯了什麼?從德爾福的角度來看,這是否正確(即通過設計)? WinAPI是否正確?該怎麼辦?

回答

4

這只是與Delphi調試器處理OutputDebugString的交互。但是,您的診斷並不反映消息如何實際到達真正的程序。

例如,假設你的程序的這個變體:

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

你會發現,當你把鼠標移動窗體的標題只改變。

或者帶上你的程序,並使用不同的調試字符串監視器。例如,來自SysInternals的DbgView。使用該外部調試字符串監視器,您會發現僅當鼠標移動時纔會到達調試消息。

我不確定Delphi調試器在做什麼,導致您觀察到的行爲。但是,請確保在實際程序中的OnMouseMove消息只有在鼠標確實在移動時纔會到達。

+0

真的。謝謝,那很簡單! – himself 2013-04-23 08:28:14