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



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

559   7  

7 ответов:

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

1.Использование 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 с одним arg, который представляет ticks не milliseconds.

TimeSpan(50); //ticks

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

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

Comments

    Ничего не найдено.