如何在不使用 Win UI 3 中的事件处理程序的情况下获取持续更新的鼠标指针坐标?[复制]

How to get continuously updating mouse pointer coordinates without using event handlers in Win UI 3? [duplicate]

提问人:Ajaykrishnan R 提问时间:11/14/2023 更新时间:11/14/2023 访问量:57

问:

private void pointerTrigger(object sender, PointerRoutedEventArgs e)
    {
        var point = e.GetCurrentPoint(UIelement);
    }

但这仅在事件发生时触发,但我正在寻找在任意调用时返回此值的方法或属性。

对于 UWP,这有效:

Windows.UI.Core.CoreWindow.GetForCurrentThread().PointerPosition;

但在 Win UI 3 中,它给出了对象未实例化错误。

我不完全确定这些是什么:

https://learn.microsoft.com/en-us/uwp/api/windows.ui.input.pointerpoint.getcurrentpoint?view=winrt-22621#windows-ui-input-pointerpoint-getcurrentpoint(system-uint32)

但是如果我没记错的话,可以静态调用 GetCurrentPoint ?

我假设 MainWindow 方法或属性应该具有这些值

C# Windows WinUI-3

评论

1赞 Simon Mourier 11/14/2023
使用互操作可能是最简单的方法 stackoverflow.com/questions/65610121/... (我同意这一切似乎有点矫枉过正)
0赞 Ajaykrishnan R 11/14/2023
@SimonMourier奏效了!
0赞 Simon Mourier 11/14/2023
然后你应该用一些细节来回答自己
0赞 Ajaykrishnan R 11/14/2023
@SimonMourier确定!
0赞 Ben Voigt 11/14/2023
与其如此努力地避免事件,不如监听鼠标运动事件,将位置存储到您自己的财产中,随时随地读取您的财产。

答:

0赞 Ajaykrishnan R 11/14/2023 #1
 namespace App {
    
    public sealed partial class MainWindow : Window {

        public class mousePointerTracking {
       
            [StructLayout(LayoutKind.Sequential)]
            public struct POINT
            {
                public int X;
                public int Y;

                public static implicit operator System.Drawing.Point(POINT point) {
                
                    return new System.Drawing.Point(point.X, point.Y);
                }
            }

            [DllImport("user32.dll")]
            static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);

            [DllImport("user32.dll")]
            static extern bool GetCursorPos(out POINT lpPoint);

            public static void GetCursorPosition(IntPtr hWnd) {
            
                POINT lpPoint;
                GetCursorPos(out lpPoint);
                ScreenToClient(hWnd, ref lpPoint);
                System.Diagnostics.Debug.WriteLine("X : " + lpPoint.X);
                System.Diagnostics.Debug.WriteLine("Y : " + lpPoint.Y);
            }
        }

        public MainWindow() {

            this.InitializeComponent();

            var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);

            Task.Run(() =>
            {
                while(true) {
                    mousePointerTracking.GetCursorPosition(hWnd);
                }
            });
          
        }
}


正如@SimonMourier所说, WinRT.Interop 用于捕获 WindowHandle,并使用 GerCursorPos 从 user32.dll 获取光标位置。来自 user32.dll 的 Screentoclient 用于计算光标相对于目标窗口的相对位置。