Comment puis-je obtenir les coordonnées d'écran actuelle de la souris dans WPF?
-
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.
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.