Wie erhalte ich die aktuelle Maus Bildschirmkoordinaten in WPF?
-
26-09-2019 - |
Frage
Wie aktuelle Maus Koordination auf dem Bildschirm zu bekommen?
Ich weiß nur, Mouse.GetPosition()
die mousePosition von Element zu bekommen, aber ich will die Koordination erhalten, ohne Element verwendet wird.
Lösung
Um auf Rachels Antwort folgen zu lassen.
Hier sind zwei Möglichkeiten, wie Sie Maus Bildschirmkoordinaten in WPF erhalten.
1.Using Windows Forms. Fügen Sie einen Verweis auf 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);
}
Andere Tipps
oder in reiner WPF Verwendung PointToScreen .
Probenhilfsmethode:
// Gets the absolute mouse position, relative to screen
Point GetMousePos(){
return _window.PointToScreen(Mouse.GetPosition(_window))
}
Haben Sie Koordinaten wollen in Bezug auf den Bildschirm oder die Anwendung?
Wenn es innerhalb der Anwendung ist einfach zu verwenden:
Mouse.GetPosition(Application.Current.MainWindow);
Wenn nicht, ich glaube, Sie einen Verweis auf System.Windows.Forms
und Verwendung hinzufügen:
System.Windows.Forms.Control.MousePosition;
Wenn Sie eine Menge dieser Antworten aus auf verschiedene Auflösungen versuchen, Computer mit mehreren Monitoren, usw. können Sie feststellen, dass sie nicht zuverlässig funktionieren. Dies liegt daran, Sie brauchen eine Transformation zu verwenden, um die Mausposition relativ zum aktuellen Bildschirm zu bekommen, nicht die gesamten Bildfläche, die alle Monitore besteht. So etwas wie dies ... (wo "this" ist ein WPF-Fenster).
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);
}
Das funktioniert, ohne Formulare zu nutzen oder DLLs importieren:
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);
}
Sie können Kombination von TimerDispatcher verwenden (WPF Timer analog) und Windows "Haken" zu fangen Cursorposition vom Betriebssystem.
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetCursorPos(out POINT pPoint);
Point ist ein Licht struct
. Es enthält nur X, Y Felder aus.
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;
}
}
Diese Lösung wird die Lösung auch das Problem mit zu oft oder zu selten Parameter lesen, so dass Sie es selbst anpassen können. Aber denken Sie daran über WPF -Methodenüberladung mit einem arg die ticks
nicht milliseconds
vertritt.
TimeSpan(50); //ticks
Wenn Sie sich für einen 1-Liner suchen, tut gut.
new Point(Mouse.GetPosition(mWindow).X + mWindow.Left, Mouse.GetPosition(mWindow).Y + mWindow.Top)
i fügen Sie diese für die Verwendung mit Kontrollen
private void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var mousepos = new List<double> { e.GetPosition(ControlName).X, e.GetPosition(ControlName).Y };
}
Mouse.GetPosition(mWindow)
gibt Ihnen die Mausposition relativ zum Parameter Ihrer Wahl.
mWindow.PointToScreen()
auf den Bildschirm die Position relativ zu einem Punkt umwandeln.
So mWindow.PointToScreen(Mouse.GetPosition(mWindow))
gibt Ihnen die Mausposition relativ zum Bildschirm, unter der Annahme, dass mWindow
ein Fenster (eigentlich jede Klasse von System.Windows.Media.Visual
abgeleitet wird diese Funktion hat), wenn Sie diese in einer WPF-Fensterklasse verwenden, soll this
arbeiten.