web-dev-qa-db-fra.com

Comment obtenir les coordonnées actuelles de l'écran de la souris dans WPF?

Comment obtenir la coordination actuelle de la souris sur l'écran? Je ne connais que Mouse.GetPosition() qui obtiennent mousePosition de l'élément, mais je souhaite obtenir la coordination sans utiliser d'élément.

57
Prince OfThief

Pour faire suite à la réponse de Rachel.
Voici deux manières d'obtenir les coordonnées d'écran de la souris dans WPF.

1.Utilisation de 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.Utilisation de 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);
}
59
Fredrik Hedblad

Ou en WPF pur, utilisez PointToScreen .

Exemple de méthode d'assistance:

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

Voulez-vous des coordonnées relatives à l'écran ou à l'application?

Si c'est dans l'application, utilisez simplement: 

Mouse.GetPosition(Application.Current.MainWindow);

Sinon, je pense que vous pouvez ajouter une référence à System.Windows.Forms et utiliser:

System.Windows.Forms.Control.MousePosition;
26
Rachel

Si vous essayez beaucoup de ces réponses sur différentes résolutions, ordinateurs avec plusieurs moniteurs, etc., vous constaterez peut-être qu'elles 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, et non la totalité de la zone d'affichage composée de tous vos moniteurs. Quelque chose comme ça ... (où "ceci" 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);
}
17
Alexandru

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);
    }
3
hemligaarne

Vous pouvez utiliser une combinaison de TimerDispatcher (analogique WPF) et de "crochets" Windows pour capturer la position du curseur du système opérationnel.

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

Le point est une lumière struct. Il ne contient que des champs 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;
        }
    }

Cette solution résout également le problème avec une lecture de paramètre trop souvent ou trop peu fréquente afin que vous puissiez l'ajuster vous-même. Mais souvenez-vous de la surcharge de la méthode WPF avec un argument représentant ticks pas milliseconds.

TimeSpan(50); //ticks
1
Max Bender

Si vous cherchez un paquebot 1, cela fonctionne bien.

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

j'ajoute ceci pour une utilisation avec des contrôles 

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

}
0
hossein sedighian

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

Donc, 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 l'utilisez dans une classe de fenêtre WPF, this devrait fonctionner.

0
Fire1nRain