Wobei die Button-Click- und DoubleClick-Ereignisse eigentlich die Mausposition direkt mitliefern, nur werden diese Information innerhalb der
VCL nicht weitergereich.
Aber man könnte diese Ereignisse auch selber abfangen.
Dafür müßte man aber die gewünschte Komponente ableiten
oder sich an Application.OnMessage dranhängen (hier muß man aber auch noch die Message mit der Komponente in Verbindung bringen).
Ein Nachteil an
TMouse.CursorPos /
GetCursorPos ist, daß diese Position nicht wirklich die Klickposition zurückgeben muß.
Denn zwischen dem Klick und dem Auslesen der Position kann durchaus etwas Zeit liegen, in welcher sich die MausPosition geändert haben könnte. Vorallem wenn die Anwendung oder der PC etwas ausgelastet ist.
[edit]
Ich hab es jetzt nicht ausprobiert, aber über
GetMessagePos und
GetMessageTime könnte man, innerhalb der ButtonClick-Methode, eventuell nachträglich an die Informationen rankommen, welche z.B. von
WM_LBUTTONDBLCLK eigentlich geliefert werden.
[edit2]
Delphi-Quellcode:
type
TComponentButtonHelper = class helper for TObject{TControl}
function GetEventMousePos: TPoint;
function GetEventTimeOffset: Integer;
end;
function TComponentButtonHelper.GetEventMousePos: TPoint;
var
MousePos: DWORD;
begin
MousePos := GetMessagePos;
Result.X := TSmallPoint(MousePos).x;
Result.Y := TSmallPoint(MousePos).y;
if Self is TControl then
Result := TControl(Self).ScreenToClient(Result);
end;
function TComponentButtonHelper.GetEventTimeOffset: Integer;
begin
Result := Integer(GetTickCount) - GetMessageTime;
end;
procedure TForm1.Memo1DblClick(Sender: TObject);
begin
Memo1.Lines.Add(Format('X=%d, Y=%d, T=%d | X=%d, Y=%d', [
Sender.GetEventMousePos.X, Sender.GetEventMousePos.Y, Sender.GetEventTimeOffset,
(Sender as TControl).ScreenToClient(Mouse.CursorPos).X, (Sender as TControl).ScreenToClient(Mouse.CursorPos).Y]));
end;
Und nun nur noch einen Timer auf die Form, z.B. mit
Sleep(750);
bei einem Interval von 1000. (oder besser noch länger)
Wenn man jetzt doppelt klickt und dannach die Maus schnell wegbewegt, dann ..........