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.

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."


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

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.


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)


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."


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

}


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;

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

0

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

using System.Runtime.InteropServices;
using System.Diagnostics;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.