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

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

Проследить ответ Рэйчел.
Вот два способа, которыми вы можете получить координаты экрана мыши в 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); } 

Или в чистом 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; ///  /// Gets the current mouse position on screen ///  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 Timer) и 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 
Interesting Posts

Почему исключения следует использовать консервативно?

Имеет ли порядок записей в таблице маршрутизации?

Скрыть одиночную форму при запуске

Совместим ли JDK «вверх» или «назад»?

Будет ли SSD-накопитель SATA работать в слоте WWAN (miniPCIe)?

Что такое полный class базы данных Android для существующей базы данных SQLite?

Выполняет ли ResultSet все данные в памяти или только по запросу?

Как я могу иметь несколько сеансов просмотра в Google Chrome?

Как построить банку, используя maven, игнорируя результаты теста?

Как resize UITextView на iOS при появлении клавиатуры?

MVC5 (VS2012) Identity CreateIdentityAsync – значение не может быть нулевым

Как скопировать в буфер обмена в Vim?

Докер не может вытащить изображения

Как получить согласованное байтовое представление строк в C # без ручного указания кодировки?

Отзывчивый сайт на iPhone – нежелательное белое пространство для поворота от пейзажа к портрету

Давайте будем гением компьютера.