Как мне получить текущие координаты экрана мыши в WPF?

StackOverflow https://stackoverflow.com/questions/4226740

  •  26-09-2019
  •  | 
  •  

Вопрос

Как получить текущую координацию мыши на экране? Я знаю только Mouse.GetPosition() которые получают мыши клейки элемента, но я хочу получить координацию без использования элемента.

Это было полезно?

Решение

Следить за ответом Рэйчел.
Вот два способа, в которых вы можете получить координаты экрана мыши в 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 (Timer WPF Analog) и 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 с одним ARG, который представляет собой ticks нет milliseconds.

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