Pregunta

Como llegar coordinación actual del ratón en la pantalla? Sólo sé que consiguen Mouse.GetPosition() mousePosition del elemento, pero quiero conseguir la coordinación sin necesidad de utilizar el elemento.

¿Fue útil?

Solución

Para dar seguimiento a la respuesta de Rachel.
He aquí dos maneras en que usted puede obtener coordenadas de pantalla ratón en WPF.

1.Using Windows Forms. Añadir una referencia a System.Windows.Forms

public static Point GetMousePositionWindowsForms()
{
    System.Drawing.Point point = Control.MousePosition;
    return new Point(point.X, point.Y);
}

2.Using 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);
}

Otros consejos

O en uso WPF pura PointToScreen .

método de ayuda de la muestra:

// Gets the absolute mouse position, relative to screen
Point GetMousePos(){
    return _window.PointToScreen(Mouse.GetPosition(_window))
}

¿Quieres coordenadas relativas a la pantalla o la aplicación?

Si es dentro de la aplicación sólo tiene que utilizar:

Mouse.GetPosition(Application.Current.MainWindow);

Si no es así, creo que se puede agregar una referencia a System.Windows.Forms y uso:

System.Windows.Forms.Control.MousePosition;

Si intenta muchas de estas respuestas a cabo en diferentes resoluciones, ordenadores con múltiples monitores, etc se puede encontrar que no funcionan de forma fiable. Esto se debe a que es necesario utilizar una transformación para obtener la posición del ratón relativa a la pantalla actual, no toda el área de visualización que consiste en todos los monitores. Algo como esto ... (donde "este" 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);
}

Estos trabajos sin tener que utilizar formas o importar cualquier 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);
    }

Se puede utilizar combinación de TimerDispatcher (WPF temporizador analógico) y Windows "ganchos" a la posición del cursor de captura desde el sistema operativo.

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetCursorPos(out POINT pPoint);

Point es un struct luz. Sólo contiene 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 está resolviendo el problema con la lectura de parámetros con demasiada frecuencia o demasiado infrecuentes para que pueda ajustar por sí mismo. Pero recordar acerca de WPF sobrecarga del método con una arg que representa a ticks no milliseconds.

TimeSpan(50); //ticks

Si usted está buscando un revestimiento 1, esto hace bien.

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

i añadir para su uso con los controles

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

}

Mouse.GetPosition(mWindow) le da la posición del ratón relativa al parámetro de su elección. mWindow.PointToScreen() convertir la posición a un punto con relación a la pantalla.

Así mWindow.PointToScreen(Mouse.GetPosition(mWindow)) le da la posición del ratón respecto a la pantalla, suponiendo que mWindow es una ventana (en realidad, cualquier clase derivada de System.Windows.Media.Visual tendrá esta función), si está utilizando esto dentro de una clase de ventana de WPF, this debería funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top