Ottenere la posizione del mouse in c #


117

Come ottengo la posizione del mouse? Lo voglio in termini di posizione dello schermo.

Avvio il mio programma che voglio impostare alla posizione corrente del mouse.

Location.X = ??
Location.Y = ??

Modifica: deve avvenire prima della creazione del modulo.

Risposte:


180

È necessario utilizzare System.Windows.Forms.Cursor.Position : "Un punto che rappresenta la posizione del cursore nelle coordinate dello schermo."


2
Cursor.Position mostra il mio suggerimento fuori schermo: (-
Thomas Eyde,

25
@Thomas Eyde: Immagino, ma potrebbe essere perché la posizione del mouse è nelle coordinate dello schermo e la posizione del tooltip è relativa alla sua finestra genitore? Potrebbe essere necessario utilizzare PointToClient.
RichieHindle

Sì, è quello che dovevo fare.
Thomas Eyde

88

Se non vuoi fare riferimento ai moduli, puoi utilizzare l'interoperabilità per ottenere la posizione del cursore:

using System.Runtime.InteropServices;
using System.Windows; // Or use whatever point class you like for the implicit cast operator
using System.Drawing;

/// <summary>
/// Struct representing a point.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;

    public static implicit operator Point(POINT point)
    {
        return new Point(point.X, point.Y);
    }
}

/// <summary>
/// Retrieves the cursor's position, in screen coordinates.
/// </summary>
/// <see>See MSDN documentation for further information.</see>
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out POINT lpPoint);

public static POINT GetCursorPosition()
{
    POINT lpPoint;
    GetCursorPos(out lpPoint);
    // NOTE: If you need error handling
    // bool success = GetCursorPos(out lpPoint);
    // if (!success)
        
    return lpPoint;
}

1
Come segnalare il tipo di PUNTO?
Manish Dubey

2
Aggiungi riferimento a System.Drawing
Bose_geek

1
soluzione fantastica. Ma non è necessario dichiarare struct POINT. Basta usare lo spazio dei nomi Win32Interop.Structs.
Manpreet Singh Dhillon

@ManpreetSinghDhillon Win32Interop.Structs è disponibile in .Net Core? Se sì, sotto quale pacchetto nuget / riferimento di sistema?
demonicdaron

@ManpreetSinghDhillon L'uso della tua struttura ti consente di eseguire il cast implicito in qualsiasi punto utilizzi nel tuo codice, è un po 'più fluido. Se Win32Interop.Structs è abbastanza per te, allora vai avanti e usalo invece!
Mo0gles

17

Cursor.Position otterrà la posizione corrente dello schermo del mouse (se ci si trova in un Control , anche la proprietà MousePosition avrà lo stesso valore).

Per impostare la posizione del mouse, dovrai usare Cursor.Positione assegnargli un nuovo punto :

Cursor.Position = new Point(x, y);

Puoi farlo nel tuo Mainmetodo prima di creare il tuo modulo.


16

Per rispondere al tuo esempio specifico:

// your example
Location.X = Cursor.Position.X;
Location.Y = Cursor.Position.Y;

// sample code
Console.WriteLine("x: " + Cursor.Position.X + " y: " + Cursor.Position.Y);

Non dimenticare di aggiungere using System.Windows.Forms;e aggiungere il riferimento ad esso (fai clic con il pulsante destro del mouse su riferimenti> aggiungi riferimento> scheda .NET> Systems.Windows.Forms> ok)


12
System.Windows.Forms.Control.MousePosition

Ottiene la posizione del cursore del mouse nelle coordinate dello schermo. "La proprietà Position è identica alla proprietà Control.MousePosition."


4
Non c'è bisogno di essere scortese. Questa è un'alternativa alla risposta primaria. Preferisco questo perché l'altro "Cursor.Position" suona come un cursore di tipo testo IMHO e "MousePosition" è più ovvio.
James

3
@ Jan Dvorak certo, e sì, ho pensato che forse fosse utile. Avrei detto qualcosa del genere "Per favore, potresti includere qualche ulteriore informazione in modo da poter vedere come questo potrebbe differire dalle risposte fornite in precedenza?"
James

@JanDvorak Se pensi che le battute non aiutino (a proposito, lo fanno), allora non dipende dal fatto che la domanda sia vecchia di 1 giorno o di 3 anni. +1 per approccio alternativo.
nawfal


6
   internal static class CursorPosition {
  [StructLayout(LayoutKind.Sequential)]
  public struct PointInter {
     public int X;
     public int Y;
     public static explicit operator Point(PointInter point) => new Point(point.X, point.Y);       
  }

  [DllImport("user32.dll")]
  public static extern bool GetCursorPos(out PointInter lpPoint);

  // For your convenience
  public static Point GetCursorPosition() {
     PointInter lpPoint;
     GetCursorPos(out lpPoint);
     return (Point) lpPoint;
  }

}


3

Inizializza il cursore corrente. Usalo per ottenere la posizione di X e Y

this.Cursor = new Cursor(Cursor.Current.Handle);
int posX = Cursor.Position.X;
int posY = Cursor.Position.Y;

3

Se hai bisogno di ottenere la posizione corrente nell'area del modulo (ottenuto sperimentalmente), prova:

Console.WriteLine("Current mouse position in form's area is " + 
    (Control.MousePosition.X - this.Location.X - 8).ToString() +
    "x" + 
    (Control.MousePosition.Y - this.Location.Y - 30).ToString()
);

Sebbene, sperimentando, sono stati trovati 8 e 30 numeri interi.

Sarebbe fantastico se qualcuno potesse spiegare perché esattamente questi numeri ^.


Inoltre, c'è un'altra variante (considerando che il codice è nel CodeBehind del modulo):

Point cp = this.PointToClient(Cursor.Position); // Getting a cursor's position according form's area
Console.WriteLine("Cursor position: X = " + cp.X + ", Y = " + cp.Y);

0

È inoltre necessario disporre delle seguenti importazioni per importare la DLL

using System.Runtime.InteropServices;
using System.Diagnostics;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.