Comment puis-je obtenir les coordonnées d'écran actuelle de la souris dans WPF?

StackOverflow https://stackoverflow.com/questions/4226740

  •  26-09-2019
  •  | 
  •  

Question

Comment obtenir la coordination actuelle de la souris sur l'écran? Je sais que Mouse.GetPosition() qui se MousePosition de l'élément, mais je veux la coordination sans utiliser l'élément.

Était-ce utile?

La solution

Pour donner suite à la réponse de Rachel.
Voici deux façons dont vous pouvez obtenir les coordonnées de l'écran de la souris dans WPF.

1.En Windows Forms. Ajouter une référence à System.Windows.Forms

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

2.Grâce 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);
}

Autres conseils

Ou utilisé pur WPF PointToScreen .

helper Exemple:

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

Voulez-vous les coordonnées par rapport à l'écran ou l'application?

S'il est dans l'application il suffit d'utiliser:

Mouse.GetPosition(Application.Current.MainWindow);

Dans le cas contraire, je crois que vous pouvez ajouter une référence à System.Windows.Forms et utilisation:

System.Windows.Forms.Control.MousePosition;

Si vous essayez beaucoup de ces réponses sur différentes résolutions, des ordinateurs avec plusieurs moniteurs, etc. vous pouvez constater qu'ils ne fonctionnent pas de manière fiable. En effet, vous devez utiliser une transformation pour obtenir la position de la souris par rapport à l'écran actuel, pas la totalité de la zone de visualisation qui se compose de tous vos moniteurs. Quelque chose comme ça ... (où "ce" est une fenêtre 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);
}

Cela fonctionne sans avoir à utiliser des formulaires ou importer des 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);
    }

Vous pouvez utiliser la combinaison de TimerDispatcher (WPF minuterie analogique) et Windows « crochets » pour attraper la position du curseur du système opérationnel.

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

Point est un struct léger. Il ne contient que X, Y champs.

    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;
        }
    }

Cette solution résout également le problème avec le paramètre trop souvent ou trop peu fréquente lecture de sorte que vous pouvez régler par vous-même. Mais rappelez-vous au sujet de la surcharge de la méthode WPF avec un arg qui représente ticks pas milliseconds.

TimeSpan(50); //ticks

Si vous cherchez un 1 liner, ce fait bien.

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

i ajouter ceci pour une utilisation avec des commandes

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

}

Mouse.GetPosition(mWindow) vous donne la position de la souris par rapport au paramètre de votre choix. mWindow.PointToScreen() convertir la position d'un point par rapport à l'écran.

mWindow.PointToScreen(Mouse.GetPosition(mWindow)) vous donne la position de la souris par rapport à l'écran, en supposant que mWindow est une fenêtre (en fait, toute classe dérivée de System.Windows.Media.Visual aura cette fonction), si vous utilisez ceci dans une classe de fenêtre WPF, this devrait fonctionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top