From 9df02431004b805fc826df5240001a846ece9221 Mon Sep 17 00:00:00 2001 From: lindexi Date: Thu, 14 Aug 2025 10:11:29 +0800 Subject: [PATCH] Fix incorrect touch point coordinates when running application on secondary screen with WM_Pointer enabled https://github.com/dotnet/wpf/issues/8517 --- .../Windows/InterOp/HwndPointerInputProvider.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/InterOp/HwndPointerInputProvider.cs b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/InterOp/HwndPointerInputProvider.cs index 5bcda18cf45..f5163a414b6 100644 --- a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/InterOp/HwndPointerInputProvider.cs +++ b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/InterOp/HwndPointerInputProvider.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. @@ -315,7 +315,20 @@ private bool ProcessMessage(uint pointerId, RawStylusActions action, int timesta /// The Y offset in logical coordiantes private void GetOriginOffsetsLogical(out int originOffsetX, out int originOffsetY) { - Point originScreenCoord = _source.RootVisual.PointToScreen(new Point(0, 0)); + Point originScreenCoord = new Point(); + + HwndSource hwndSource = PresentationSource.FromVisual(_source.RootVisual) as HwndSource; + if (hwndSource != null) + { + HandleRef handleRef = new HandleRef(hwndSource, hwndSource.Handle); + + MS.Win32.NativeMethods.POINT point = new MS.Win32.NativeMethods.POINT(); + MS.Win32.UnsafeNativeMethods.ClientToScreen(handleRef, ref point); + + var displayRect = _currentTabletDevice.DeviceInfo.DisplayRect; + + originScreenCoord = new Point(point.x - displayRect.left, point.y - displayRect.top); + } // Use the inverse of our logical tablet to screen matrix to generate tablet coords MatrixTransform screenToTablet = new MatrixTransform(_currentTabletDevice.TabletToScreen);