如何在屏幕上当前鼠标的协调? 我只知道它获得元素的mousePosition Mouse.GetPosition(),但我想不使用要素的协调。

有帮助吗?

解决方案

要跟进Rachel的答案。结果 这里有两种方法可以得到鼠标屏幕坐标在WPF。

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

public static Point GetMousePositionWindowsForms()
{
    System.Drawing.Point 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()
{
    Win32Point w32Mouse = new Win32Point();
    GetCursorPos(ref w32Mouse);
    return new Point(w32Mouse.X, w32Mouse.Y);
}

其他提示

或者在纯WPF使用 PointToScreen

样品辅助方法:

// Gets the absolute mouse position, relative to screen
Point GetMousePos(){
    return _window.PointToScreen(Mouse.GetPosition(_window))
}

你想相对于屏幕或应用坐标?

如果它是在应用程序中只需使用:

Mouse.GetPosition(Application.Current.MainWindow);

如果没有,我相信你可以添加一个引用到System.Windows.Forms及用途:

System.Windows.Forms.Control.MousePosition;

如果你尝试了很多这些答案出来不同的分辨率,具有多显示器等电脑你会发现,他们并不可靠地工作。这是因为你需要使用转换来获取相对于当前的屏幕,而不是它由所有显示器的整个观看区域的鼠标位置。像这样...(其中, “该” 是WPF窗口)。

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

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

这个作品而不必使用形式或导入任何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);
    }

您可以使用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方法重载其代表ticksmilliseconds

TimeSpan(50); //ticks

如果你正在寻找一个1套,该做的好。

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

我添加此为与对照使用

   private void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
 var mousepos = new List<double> { e.GetPosition(ControlName).X, e.GetPosition(ControlName).Y };

}

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

所以mWindow.PointToScreen(Mouse.GetPosition(mWindow))给你相对于屏幕鼠标位置,假定mWindow是一个窗口(实际上,从System.Windows.Media.Visual派生的任何类将具有此功能),如果正在使用此WPF窗口类内部,this应该工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top