Obtenir la position de la souris en c #

117

Comment obtenir la position de la souris? Je le veux en terme de position d'écran.

Je lance mon programme et je souhaite régler la position actuelle de la souris.

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

Modifier: cela doit se produire avant la création du formulaire.

Athiwat Chunlakhan
la source

Réponses:

180

Vous devez utiliser System.Windows.Forms.Cursor.Position : "Un point qui représente la position du curseur en coordonnées d'écran."

RichieHindle
la source
2
Cursor.Position affiche mon info-bulle hors écran: (-
Thomas Eyde
25
@Thomas Eyde: Je suppose, mais cela pourrait-il être dû au fait que la position de la souris est en coordonnées d'écran et que la position de votre info-bulle est relative à sa fenêtre parente? Vous devrez peut-être utiliser PointToClient.
RichieHindle
Oui, c'est ce que je devais faire.
Thomas Eyde
88

Si vous ne souhaitez pas référencer Forms, vous pouvez utiliser l'interopérabilité pour obtenir la position du curseur:

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;
}
Mo0gles
la source
1
Comment référencer le type POINT?
Manish Dubey
2
Ajouter une référence à System.Drawing
Bose_geek
1
solution géniale. Mais vous n'avez pas besoin de déclarer struct POINT. Utilisez simplement l'espace de noms Win32Interop.Structs.
Manpreet Singh Dhillon le
@ManpreetSinghDhillon Win32Interop.Structs est-il disponible dans .Net Core? Si oui, sous quelle référence de package / système nuget?
demonicdaron
@ManpreetSinghDhillon L'utilisation de votre propre structure vous permet de le transtyper implicitement en tout point que vous utilisez dans votre code, c'est un peu plus fluide. Si Win32Interop.Structs vous suffit, allez-y et utilisez-le à la place!
Mo0gles
17

Cursor.Position obtiendra l'empoisonnement d'écran actuel de la souris (si vous êtes dans un Control , MousePosition propriété aura également la même valeur).

Pour définir la position de la souris, vous devrez utiliser Cursor.Positionet lui donner un nouveau point :

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

Vous pouvez le faire dans votre Mainméthode avant de créer votre formulaire.

Adrianbanks
la source
16

Pour répondre à votre exemple spécifique:

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

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

N'oubliez pas d'ajouter using System.Windows.Forms;, et d'y ajouter la référence (clic droit sur références> ajouter une référence> onglet .NET> Systems.Windows.Forms> ok)

Benjamin Crouzier
la source
12
System.Windows.Forms.Control.MousePosition

Obtient la position du curseur de la souris en coordonnées d'écran. "La propriété Position est identique à la propriété Control.MousePosition."

James
la source
4
Pas besoin d'être grossier. Ceci est une alternative à la réponse principale. Je préfère simplement celui-ci parce que l'autre «Cursor.Position» sonne comme un curseur de type texte IMHO et «MousePosition» est plus évident.
James
3
@Jan Dvorak bien sûr, et oui, j'ai pensé que c'était peut-être utile. J'aurais dit quelque chose comme ceci "Pouvez-vous inclure un peu plus d'informations pour que je puisse voir en quoi cela peut différer des réponses données précédemment?"
James
@JanDvorak Si vous pensez que les one-liners n'aident pas (btw, ils le font), cela ne dépend pas du fait que la question ait 1 jour ou 3 ans. +1 pour une approche alternative.
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;
  }

}

Carlos Alberto Flores Onofre
la source
3

Initialisez le curseur actuel. Utilisez-le pour obtenir la position de X et Y

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

Si vous avez besoin d'obtenir la position actuelle dans la zone du formulaire (obtenue expérimentalement), essayez:

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()
);

Bien que 8 et 30 entiers aient été trouvés en expérimentant.

Ce serait génial si quelqu'un pouvait expliquer pourquoi exactement ces chiffres ^.


En outre, il existe une autre variante (étant donné que le code est dans CodeBehind de Form):

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);
F8ER
la source
0

Vous devez également disposer des importations suivantes pour importer la DLL

using System.Runtime.InteropServices;
using System.Diagnostics;
Austin Traphofner
la source