Как получить текущие координаты экрана мыши в WPF? - PullRequest
62 голосов
/ 19 ноября 2010

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

Ответы [ 9 ]

66 голосов
/ 26 апреля 2012

Или в чистом WPF используйте PointToScreen .

Пример вспомогательного метода:

// Gets the absolute mouse position, relative to screen
Point GetMousePos(){
    return _window.PointToScreen(Mouse.GetPosition(_window))
}
64 голосов
/ 20 ноября 2010

Чтобы продолжить ответ Рэйчел.
Вот два способа получить координаты экрана мыши в WPF.

1.Использование Windows Forms. Добавить ссылку на 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);
}
27 голосов
/ 19 ноября 2010

Хотите ли вы координаты относительно экрана или приложения?

Если оно находится внутри приложения, просто используйте:

Mouse.GetPosition(Application.Current.MainWindow);

Если нет, я думаю, вы можете добавить ссылку на System.Windows.Forms и использование:

System.Windows.Forms.Control.MousePosition;
18 голосов
/ 05 ноября 2013

Если вы попробуете многие из этих ответов на разных разрешениях, компьютерах с несколькими мониторами и т. Д., Вы можете обнаружить, что они не работают надежно.Это потому, что вам нужно использовать преобразование, чтобы получить положение мыши относительно текущего экрана, а не всю область просмотра, которая состоит из всех ваших мониторов.Примерно так ... (где "this" - это окно 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);
}
4 голосов
/ 02 января 2018

Это работает без использования форм или импорта каких-либо 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);
    }
1 голос
/ 02 октября 2018

Если вы ищете 1 вкладыш, это хорошо.

new Point(Mouse.GetPosition(mWindow).X + mWindow.Left, Mouse.GetPosition(mWindow).Y + mWindow.Top)
1 голос
/ 04 марта 2018

Вы можете использовать комбинацию 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
0 голосов
/ 21 мая 2019

Mouse.GetPosition(mWindow) дает вам положение мыши относительно параметра по вашему выбору.mWindow.PointToScreen() преобразует положение в точку относительно экрана.

Таким образом, mWindow.PointToScreen(Mouse.GetPosition(mWindow)) дает вам положение мыши относительно экрана, предполагая, что mWindow является окном (фактически, любой класс, производный от System.Windows.Media.Visual будет иметь эту функцию), если вы используете ее внутри класса окна WPF, this должно работать.

0 голосов
/ 22 декабря 2018

я добавляю это для использования с элементами управления

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

}
...