From f8f7453cd6eae8f97035c3a3de3aa31d636c86a3 Mon Sep 17 00:00:00 2001 From: Alessio Doria Date: Tue, 4 Mar 2025 16:40:58 +0100 Subject: [PATCH 1/3] Update User32.cs --- src/Wpf.Ui/Interop/User32.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Wpf.Ui/Interop/User32.cs b/src/Wpf.Ui/Interop/User32.cs index 43e39563d..c33027bde 100644 --- a/src/Wpf.Ui/Interop/User32.cs +++ b/src/Wpf.Ui/Interop/User32.cs @@ -1450,6 +1450,9 @@ [In] IntPtr lParam [DllImport(Libraries.User32, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetCursorPos([Out] out WinDef.POINT lpPoint); + [DllImport(Libraries.User32), SetLastError = true)] + public static extern bool GetCursorPos(out System.Drawing.Point lpPoint); + [DllImport(Libraries.User32)] public static extern bool UnionRect(out WinDef.RECT rcDst, ref WinDef.RECT rc1, ref WinDef.RECT rc2); From 9a7231ce364934ab7ce26e7f586ced726bbee147 Mon Sep 17 00:00:00 2001 From: Alessio Doria Date: Tue, 4 Mar 2025 16:41:37 +0100 Subject: [PATCH 2/3] Update TitleBarButton.cs --- .../Controls/TitleBar/TitleBarButton.cs | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/Wpf.Ui/Controls/TitleBar/TitleBarButton.cs b/src/Wpf.Ui/Controls/TitleBar/TitleBarButton.cs index 83f8ad744..bc7f7dccb 100644 --- a/src/Wpf.Ui/Controls/TitleBar/TitleBarButton.cs +++ b/src/Wpf.Ui/Controls/TitleBar/TitleBarButton.cs @@ -232,4 +232,39 @@ protected void OnButtonTypeChanged(DependencyPropertyChangedEventArgs e) ), }; } + + PresentationSource presentationSource = null; + + protected bool IsMouseOverElement(nint lParam) + { + System.Drawing.Point winPoint; + bool gotCursorPos = User32.GetCursorPos(out winPoint); + + if (!gotCursorPos) + { + int fallbackX = unchecked((short)((long)lParam & 0xFFFF)); + int fallbackY = unchecked((short)(((long)lParam >> 16) & 0xFFFF)); + winPoint = new System.Drawing.Point(fallbackX, fallbackY); + } + + var screenPoint = new System.Windows.Point(winPoint.X, winPoint.Y); + + presentationSource ??= PresentationSource.FromVisual(this); + + if (presentationSource?.CompositionTarget != null) + { + screenPoint = presentationSource.CompositionTarget.TransformFromDevice.Transform(screenPoint); + } + + var localPoint = this.PointFromScreen(screenPoint); + + var hitTestRect = + new System.Windows.Rect( + 0, + 0, + this.ActualWidth, + this.ActualHeight); + + return hitTestRect.Contains(localPoint); + } } From c28cba6d8b35e507c82a9cfa642598a02cf7f0ed Mon Sep 17 00:00:00 2001 From: Alessio Doria Date: Tue, 4 Mar 2025 23:19:15 +0100 Subject: [PATCH 3/3] Update User32.cs --- src/Wpf.Ui/Interop/User32.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Wpf.Ui/Interop/User32.cs b/src/Wpf.Ui/Interop/User32.cs index c33027bde..ffc967ed6 100644 --- a/src/Wpf.Ui/Interop/User32.cs +++ b/src/Wpf.Ui/Interop/User32.cs @@ -1450,7 +1450,7 @@ [In] IntPtr lParam [DllImport(Libraries.User32, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetCursorPos([Out] out WinDef.POINT lpPoint); - [DllImport(Libraries.User32), SetLastError = true)] + [DllImport(Libraries.User32, SetLastError = true)] public static extern bool GetCursorPos(out System.Drawing.Point lpPoint);