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

wgeznvg7  于 2023-04-22  发布在  其他
关注(0)|答案(9)|浏览(567)

如何获取当前鼠标在屏幕上的坐标?我只知道Mouse.GetPosition(),它可以获取元素的mousePosition,但我想在不使用元素的情况下获取坐标。

xkftehaa

xkftehaa1#

或者在纯WPF中使用PointToScreen
示例辅助方法:

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

fjaof16o2#

去跟进瑞秋的回答。
这里有两种方法,你可以得到鼠标屏幕坐标在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);
}
zqdjd7g9

zqdjd7g93#

是否需要相对于屏幕或应用程序的坐标?
如果它在应用程序中,只需用途:

Mouse.GetPosition(Application.Current.MainWindow);

如果没有,我相信你可以添加对System.Windows.Forms的引用并用途:

System.Windows.Forms.Control.MousePosition;
xqkwcwgp

xqkwcwgp4#

如果你在不同的分辨率、多个显示器的电脑等上尝试了很多这些答案,你可能会发现它们并不可靠。这是因为你需要使用一个转换来获得鼠标相对于当前屏幕的位置,而不是由所有显示器组成的整个查看区域。类似这样的东西...(其中“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);
}
jv4diomz

jv4diomz5#

这无需使用表单或导入任何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);
    }
ffdz8vbo

ffdz8vbo6#

您可以使用TimerDispatcher(WPF定时器模拟)和Windows“挂钩”的组合来捕获操作系统中的光标位置。

[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
tnkciper

tnkciper7#

如果你正在寻找一个1班轮,这是很好的。

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

+ mWindow.Left+ mWindow.Top确保位置在正确的位置,即使用户拖动窗口。

wtlkbnrh

wtlkbnrh8#

Mouse.GetPosition(mWindow)提供鼠标相对于所选参数的位置。mWindow.PointToScreen()将位置转换为相对于屏幕的点。
所以mWindow.PointToScreen(Mouse.GetPosition(mWindow))给你鼠标相对于屏幕的位置,假设mWindow是一个窗口(实际上,任何从System.Windows.Media.Visual派生的类都有这个函数),如果你在WPF窗口类中使用这个函数,this应该可以工作。

mbskvtky

mbskvtky9#

我想用这个密码

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
}

相关问题