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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top