WPF中如何获取当前鼠标屏幕坐标?

问题描述 投票:0回答:10

如何获取当前鼠标在屏幕上的坐标? 我只知道

Mouse.GetPosition()
可以获取元素的 mousePosition,但我想在不使用元素的情况下获得协调。

wpf mouse-coordinates
10个回答
94
投票

或者在纯 WPF 中使用 PointToScreen

辅助方法示例:

// Gets the absolute mouse position, relative to screen
Point GetMousePos() => _window.PointToScreen(Mouse.GetPosition(_window));

85
投票

跟进雷切尔的回答。
您可以通过以下两种方式在 WPF 中获取鼠标屏幕坐标。

1.使用Windows窗体。添加对 System.Windows.Forms 的引用

public static Point GetMousePositionWindowsForms()
{
    var point = Control.MousePosition;
    return new Point(point.X, point.Y);
}

2.使用Win32

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetCursorPos(ref Win32Point pt);

[StructLayout(LayoutKind.Sequential)]
internal struct Win32Point
{
    public Int32 X;
    public Int32 Y;
};
public static Point GetMousePosition()
{
    var w32Mouse = new Win32Point();
    GetCursorPos(ref w32Mouse);

    return new Point(w32Mouse.X, w32Mouse.Y);
}

34
投票

您想要相对于屏幕或应用程序的坐标吗?

如果它在应用程序内,只需使用:

Mouse.GetPosition(Application.Current.MainWindow);

如果没有,我相信您可以添加对

System.Windows.Forms
的引用并使用:

System.Windows.Forms.Control.MousePosition;

25
投票

如果您在不同的分辨率、具有多个显示器的计算机等上尝试了很多这些答案,您可能会发现它们不能可靠地工作。这是因为您需要使用变换来获取鼠标相对于当前屏幕的位置,而不是包含所有显示器的整个查看区域。像这样的东西...(其中“this”是一个 WPF 窗口)。

var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice;
var mouse = transform.Transform(GetMousePosition());

public System.Windows.Point GetMousePosition()
{
    var point = Forms.Control.MousePosition;
    return new Point(point.X, point.Y);
}

8
投票

无需使用表单或导入任何 DLL 即可工作:

   using System.Windows;
   using System.Windows.Input;

    /// <summary>
    /// Gets the current mouse position on screen
    /// </summary>
    private Point GetMousePosition()
    {
        // Position of the mouse relative to the window
        var position = Mouse.GetPosition(Window);

        // Add the window position
        return new Point(position.X + Window.Left, position.Y + Window.Top);
    }

5
投票

您可以结合使用 TimerDispatcher(WPF 定时器模拟)和 Windows“Hooks”来从操作系统捕获光标位置。

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetCursorPos(out POINT pPoint);

点是一盏灯

struct
。它仅包含 X、Y 字段。

    public MainWindow()
    {
        InitializeComponent();

        DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer();
        dt.Tick += new EventHandler(timer_tick);
        dt.Interval = new TimeSpan(0,0,0,0, 50);
        dt.Start();
    }

    private void timer_tick(object sender, EventArgs e)
    {
        POINT pnt;
        GetCursorPos(out pnt);
        current_x_box.Text = (pnt.X).ToString();
        current_y_box.Text = (pnt.Y).ToString();
    }

    public struct POINT
    {
        public int X;
        public int Y;

        public POINT(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
    }

这个方案也解决了参数读取太频繁或太少的问题,您可以自行调整。但请记住,带有一个参数的 WPF 方法重载代表

ticks
而不是
milliseconds

TimeSpan(50); //ticks

3
投票

如果您正在寻找 1 衬垫,这款就很适合。

new Point(Mouse.GetPosition(mWindow).X + mWindow.Left, Mouse.GetPosition(mWindow).Y + mWindow.Top)

即使用户拖动窗口,

+ mWindow.Left
+ mWindow.Top
也能确保位置位于正确的位置。


1
投票

Mouse.GetPosition(mWindow)
为您提供相对于您选择的参数的鼠标位置。
mWindow.PointToScreen()
将位置转换为相对于屏幕的点。

因此,

mWindow.PointToScreen(Mouse.GetPosition(mWindow))
为您提供相对于屏幕的鼠标位置,假设
mWindow
是一个窗口(实际上,任何从
System.Windows.Media.Visual
派生的类都将具有此功能),如果您在WPF窗口类中使用它,
this
应该可以工作。


0
投票

我想使用这个代码

Point PointA;
private void Button_PreviewMouseUp(object sender, MouseButtonEventArgs e) {
    PointA = e.MouseDevice.GetPosition(sender as UIElement);
}

private void Button_Click(object sender, RoutedEventArgs e) {
    // use PointA Here
}

0
投票

在纯WPF中获取当前窗口实例('this')的鼠标绝对坐标(在双4K屏幕上测试)

System.Windows.Point  MousePos  =  this.PointToScreen( System.Windows.Input.Mouse.GetPosition(this));
© www.soinside.com 2019 - 2024. All rights reserved.