提问人:Ajaykrishnan R 提问时间:11/14/2023 更新时间:11/14/2023 访问量:57
如何在不使用 Win UI 3 中的事件处理程序的情况下获取持续更新的鼠标指针坐标?[复制]
How to get continuously updating mouse pointer coordinates without using event handlers in Win UI 3? [duplicate]
问:
private void pointerTrigger(object sender, PointerRoutedEventArgs e)
{
var point = e.GetCurrentPoint(UIelement);
}
但这仅在事件发生时触发,但我正在寻找在任意调用时返回此值的方法或属性。
对于 UWP,这有效:
Windows.UI.Core.CoreWindow.GetForCurrentThread().PointerPosition;
但在 Win UI 3 中,它给出了对象未实例化错误。
我不完全确定这些是什么:
但是如果我没记错的话,可以静态调用 GetCurrentPoint ?
我假设 MainWindow 方法或属性应该具有这些值
答:
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 用于计算光标相对于目标窗口的相对位置。
评论