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