Domanda

Come arrivare coordinamento corrente del mouse sullo schermo? So solo che Mouse.GetPosition() ottenere mousePosition di elemento, ma voglio ottenere il coordinamento senza usare elemento.

È stato utile?

Soluzione

Per il follow-up sulla risposta di Rachel.
Ecco due modi in cui è possibile ottenere mouse coordinate dello schermo in WPF.

1.Utilizzando Windows Form. Aggiungere un riferimento a System.Windows.Forms

public static Point GetMousePositionWindowsForms()
{
    System.Drawing.Point point = Control.MousePosition;
    return new Point(point.X, point.Y);
}

2.Tramite 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);
}

Altri suggerimenti

o in uso puro WPF PointToScreen .

metodo di supporto del campione:

// Gets the absolute mouse position, relative to screen
Point GetMousePos(){
    return _window.PointToScreen(Mouse.GetPosition(_window))
}

Vuoi coordinate relative allo schermo o l'applicazione?

Se è all'interno dell'applicazione basta usare:

Mouse.GetPosition(Application.Current.MainWindow);

In caso contrario, io credo che si possa aggiungere un riferimento a System.Windows.Forms ed impiego:

System.Windows.Forms.Control.MousePosition;

Se si tenta un sacco di queste risposte su diverse risoluzioni, i computer con più monitor, ecc si potrebbe scoprire che non funzionano in modo affidabile. Questo perché è necessario utilizzare una trasformazione per ottenere la posizione del mouse relativa alla schermata corrente, non l'intera area di visualizzazione che si compone di tutti i monitor. Qualcosa di simile a questo ... (dove "questa" è una finestra 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);
}

Questo funziona senza dover utilizzare moduli o importare qualsiasi 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);
    }

È possibile utilizzare combinazione di TimerDispatcher (WPF timer analogico) e Windows "ganci" per posizione del cursore fermo dal sistema operativo.

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetCursorPos(out POINT pPoint);

Point è un struct luce. Esso contiene solo X, Y campi.

    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;
        }
    }

Questa soluzione è anche risolvendo il problema con la lettura dei parametri troppo spesso o troppo poco frequenti in modo da poter regolare da soli. Ma ricordate sul metodo di sovraccarico WPF con un ARG, che sta rappresentando ticks non milliseconds.

TimeSpan(50); //ticks

Se siete alla ricerca di un 1 fodera, questo fa bene.

new Point(Mouse.GetPosition(mWindow).X + mWindow.Left, Mouse.GetPosition(mWindow).Y + mWindow.Top)

aggiungo questo per l'uso con i comandi

   private void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
 var mousepos = new List<double> { e.GetPosition(ControlName).X, e.GetPosition(ControlName).Y };

}

Mouse.GetPosition(mWindow) ti dà la posizione del mouse relativa al parametro di vostra scelta. mWindow.PointToScreen() di convertire la posizione ad un punto rispetto allo schermo.

Quindi mWindow.PointToScreen(Mouse.GetPosition(mWindow)) ti dà la posizione del mouse rispetto allo schermo, supponendo che mWindow è una finestra (in realtà, qualsiasi classe derivata da System.Windows.Media.Visual avrà questa funzione), se si utilizza questo all'interno di una classe di finestra WPF, this dovrebbe funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top