¿Cómo obtengo las coordenadas actuales de la pantalla del mouse en WPF?
mouse-coordinates (6)
¿Quieres coordenadas relativas a la pantalla o la aplicación?
Si está dentro de la aplicación solo usa:
Mouse.GetPosition(Application.Current.MainWindow);
De lo contrario, creo que puede agregar una referencia a System.Windows.Forms
y usar:
System.Windows.Forms.Control.MousePosition;
¿Cómo obtener la coordinación actual del mouse en la pantalla? Solo sé Mouse.GetPosition()
que obtiene mousePosition del elemento, pero quiero obtener la coordinación sin usar elemento.
Esto funciona sin tener que usar formularios o importar archivos 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);
}
O en puro WPF use PointToScreen .
Método de ayuda de muestra:
// Gets the absolute mouse position, relative to screen
Point GetMousePos(){
return _window.PointToScreen(Mouse.GetPosition(_window))
}
Para dar seguimiento a la respuesta de Rachel.
Aquí hay dos formas en que puede obtener las coordenadas de la pantalla del mouse en WPF.
1. Uso de formularios de Windows. Agregue una referencia a System.Windows.Forms
public static Point GetMousePositionWindowsForms()
{
System.Drawing.Point point = Control.MousePosition;
return new Point(point.X, point.Y);
}
2.Usando 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);
}
Puede usar la combinación de TimerDispatcher (WPF Timer analog) y Windows "Hooks" para capturar la posición del cursor desde el sistema operativo.
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetCursorPos(out POINT pPoint);
Point es una struct
ligera. Contiene solo campos 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;
}
}
Esta solución también resuelve el problema con la lectura de parámetros con demasiada frecuencia o muy poco frecuente para que pueda ajustarlo usted mismo. Pero recuerde sobre la sobrecarga del método WPF con un argumento que representa ticks
no milliseconds
.
TimeSpan(50); //ticks
Si prueba muchas de estas respuestas en diferentes resoluciones, computadoras con múltiples monitores, etc., puede descubrir que no funcionan de manera confiable. Esto se debe a que necesita utilizar una transformación para obtener la posición del mouse en relación con la pantalla actual, no el área de visualización completa que consta de todos sus monitores. Algo como esto ... (donde "esto" es una ventana de 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);
}