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.
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);
}
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))
}
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;
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);
}
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 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
Si vous cherchez un paquebot 1, cela fonctionne bien.
new Point(Mouse.GetPosition(mWindow).X + mWindow.Left, Mouse.GetPosition(mWindow).Y + mWindow.Top)
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 };
}
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.