Wie erhalte ich die aktuelle Mauskoordination auf dem Bildschirm? Ich weiß nur, Mouse.GetPosition()
welche mousePosition des Elements erhalten, aber ich möchte die Koordination ohne Verwendung des Elements erhalten.
wpf
mouse-coordinates
Prinz des Diebes
quelle
quelle
System.Windows.Forms.Cursor.Position
Antworten:
Um Rachels Antwort zu verfolgen.
Hier sind zwei Möglichkeiten, wie Sie Mausbildschirmkoordinaten in WPF erhalten können.
1.Verwenden von Windows Forms. Fügen Sie einen Verweis auf System.Windows.Forms hinzu
public static Point GetMousePositionWindowsForms() { var point = Control.MousePosition; return new Point(point.X, point.Y); }
2.Verwenden von 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() { var w32Mouse = new Win32Point(); GetCursorPos(ref w32Mouse); return new Point(w32Mouse.X, w32Mouse.Y); }
quelle
Oder verwenden Sie in reinem WPF PointToScreen .
Beispiel für eine Hilfsmethode:
// Gets the absolute mouse position, relative to screen Point GetMousePos() => _window.PointToScreen(Mouse.GetPosition(_window));
quelle
Möchten Sie Koordinaten relativ zum Bildschirm oder zur Anwendung?
Wenn es in der Anwendung enthalten ist, verwenden Sie einfach:
Wenn nicht, können Sie meiner Meinung nach einen Verweis hinzufügen
System.Windows.Forms
und verwenden:quelle
error CS0234: The type or namespace name 'Control' does not exist in the namespace 'System.Windows.Forms' (are you missing an assembly reference?)
Wenn Sie viele dieser Antworten auf verschiedenen Auflösungen, Computern mit mehreren Monitoren usw. ausprobieren, stellen Sie möglicherweise fest, dass sie nicht zuverlässig funktionieren. Dies liegt daran, dass Sie eine Transformation verwenden müssen, um die Mausposition relativ zum aktuellen Bildschirm zu ermitteln, nicht den gesamten Anzeigebereich, der aus all Ihren Monitoren besteht. So etwas in der Art ... (wobei "dies" ein WPF-Fenster ist).
var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice; var mouse = transform.Transform(GetMousePosition()); public System.Windows.Point GetMousePosition() { var point = Forms.Control.MousePosition; return new Point(point.X, point.Y); }
quelle
Dies funktioniert, ohne Formulare verwenden oder DLLs importieren zu müssen:
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); }
quelle
Sie können eine Kombination aus TimerDispatcher (WPF Timer analog) und Windows "Hooks" verwenden, um die Cursorposition vom Betriebssystem zu erfassen.
[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetCursorPos(out POINT pPoint);
Punkt ist ein Licht
struct
. Es enthält nur X-, Y-Felder.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 löst das Problem auch durch zu häufiges oder zu seltenes Lesen von Parametern, sodass Sie es selbst anpassen können. Denken Sie jedoch an die Überladung der WPF-Methode mit einem Argument, das
ticks
nicht darstelltmilliseconds
.TimeSpan(50); //ticks
quelle
Wenn Sie nach einem 1-Liner suchen, ist dies gut.
new Point(Mouse.GetPosition(mWindow).X + mWindow.Left, Mouse.GetPosition(mWindow).Y + mWindow.Top)
Das
+ mWindow.Left
und+ mWindow.Top
stellt sicher, dass die Position an der richtigen Stelle ist, auch wenn der Benutzer das Fenster herumzieht.quelle
Mouse.GetPosition(mWindow)
gibt Ihnen die Mausposition relativ zum Parameter Ihrer Wahl.mWindow.PointToScreen()
Konvertieren Sie die Position in einen Punkt relativ zum Bildschirm.So
mWindow.PointToScreen(Mouse.GetPosition(mWindow))
haben Sie die Mausposition relativ zum Bildschirm, unter der Annahme , dassmWindow
ein Fenster (eigentlich aus jeder Klasse abgeleitetSystem.Windows.Media.Visual
wird diese Funktion haben), wenn Sie diese verwenden innerhalb einer WPF - Fensterklasse,this
funktionieren sollte.quelle