diff --git a/lcl/controls.pp b/lcl/controls.pp index 0cd3a39dfb..bfcda1903c 100644 --- a/lcl/controls.pp +++ b/lcl/controls.pp @@ -1287,7 +1287,7 @@ type function IsHelpKeyWordStored: Boolean; function IsShowHintStored: Boolean; function IsVisibleStored: Boolean; - procedure DoBeforeMouseMessage; + procedure DoBeforeMouseMessage(TheMessage: TLMessage); procedure DoConstrainedResize(var NewLeft, NewTop, NewWidth, NewHeight: Integer); procedure SetAccessibleName(AValue: TCaption); procedure SetAccessibleDescription(AValue: TCaption); diff --git a/lcl/forms.pp b/lcl/forms.pp index 91708935a0..b083084a27 100644 --- a/lcl/forms.pp +++ b/lcl/forms.pp @@ -1583,6 +1583,7 @@ type destructor Destroy; override; procedure ActivateHint(CursorPos: TPoint; CheckHintControlChange: Boolean = False); function GetControlAtMouse: TControl; + function GetControlAtPos(P: TPoint): TControl; procedure ControlDestroyed(AControl: TControl); function BigIconHandle: HIcon; function SmallIconHandle: HIcon; diff --git a/lcl/include/application.inc b/lcl/include/application.inc index e2ce3b6988..1b6eed032f 100644 --- a/lcl/include/application.inc +++ b/lcl/include/application.inc @@ -559,7 +559,12 @@ var P: TPoint; begin GetCursorPos(P); - //debugln(['TApplication.GetControlAtMouse p=',dbgs(p),' FLastMousePos=',dbgs(FLastMousePos)]); + Result:= GetControlAtPos(P); +end; + +function TApplication.GetControlAtPos(P: TPoint): TControl; +begin + //debugln(['TApplication.GetControlAtPos p=',dbgs(p),' FLastMousePos=',dbgs(FLastMousePos)]); if FLastMouseControlValid and (P.X = FLastMousePos.x) and (P.Y = FLastMousePos.Y) then Result := FLastMouseControl else diff --git a/lcl/include/control.inc b/lcl/include/control.inc index 95cf899f8d..df4824d898 100644 --- a/lcl/include/control.inc +++ b/lcl/include/control.inc @@ -1399,15 +1399,21 @@ end; {------------------------------------------------------------------------------ procedure TControl.DoBeforeMouseMessage; ------------------------------------------------------------------------------} -procedure TControl.DoBeforeMouseMessage; +procedure TControl.DoBeforeMouseMessage(TheMessage: TLMessage); var + MouseMessage: TLMMouse absolute TheMessage; + P: TPoint; NewMouseControl: TControl; begin if Assigned(Application) then begin NewMouseControl := GetCaptureControl; if NewMouseControl = nil then - NewMouseControl := Application.GetControlAtMouse; + begin + P := GetMousePosFromMessage(MouseMessage.Pos); + p := ClientToScreen(P); + NewMouseControl := Application.GetControlAtPos(P); + end; Application.DoBeforeMouseMessage(NewMouseControl); end; end; diff --git a/lcl/include/wincontrol.inc b/lcl/include/wincontrol.inc index 31092eb874..6ca79ec604 100644 --- a/lcl/include/wincontrol.inc +++ b/lcl/include/wincontrol.inc @@ -5392,7 +5392,7 @@ begin DebugLn('TWinControl.WndPRoc A ',Name,':',ClassName); {$ENDIF} //if Message.Msg=LM_RBUTTONUP then begin DebugLn(['TWinControl.WndProc ',DbgSName(Self)]); DumpStack end; - DoBeforeMouseMessage; + DoBeforeMouseMessage(Message); if IsControlMouseMSG(Message) then Exit else