Mausposition in c # abrufen

117

Wie erhalte ich die Mausposition? Ich möchte es in Bezug auf die Bildschirmposition.

Ich starte mein Programm, das ich auf die aktuelle Mausposition einstellen möchte.

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

Bearbeiten: Dies muss geschehen, bevor das Formular erstellt wird.

Athiwat Chunlakhan
quelle

Antworten:

180

Sie sollten System.Windows.Forms.Cursor.Position verwenden : "Ein Punkt, der die Position des Cursors in Bildschirmkoordinaten darstellt."

RichieHindle
quelle
2
Cursor.Position zeigt meinen Tooltip außerhalb des Bildschirms an: (-
Thomas Eyde
25
@ Thomas Eyde: Ich vermute, aber könnte das daran liegen, dass die Mausposition in Bildschirmkoordinaten angegeben ist und Ihre QuickInfo-Position relativ zum übergeordneten Fenster ist? Möglicherweise müssen Sie verwenden PointToClient.
RichieHindle
Ja, das musste ich tun.
Thomas Eyde
88

Wenn Sie nicht auf Formulare verweisen möchten, können Sie Interop verwenden, um die Cursorposition abzurufen:

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
quelle
1
Wie beziehe ich mich auf den POINT-Typ?
Manish Dubey
2
Verweis auf System.Drawing
Bose_geek
1
tolle Lösung. Sie müssen struct POINT jedoch nicht deklarieren. Verwenden Sie einfach den Namespace Win32Interop.Structs.
Manpreet Singh Dhillon
@ManpreetSinghDhillon Ist Win32Interop.Structs in .Net Core verfügbar? Wenn ja, unter welcher Nuget-Paket- / Systemreferenz?
Demonicdaron
@ManpreetSinghDhillon Wenn Sie Ihre eigene Struktur verwenden, können Sie diese implizit an den Punkt umwandeln, den Sie in Ihrem Code verwenden. Dies ist etwas flüssiger. Wenn Win32Interop.Structs für Sie ausreicht, verwenden Sie es stattdessen!
Mo0gles
17

Cursor.Position den aktuellen Bildschirm poisition der Maus (wenn Sie in einem sind Kontrolle , die MousePosition wird Eigenschaft auch den gleichen Wert erhalten).

Um die Mausposition festzulegen, müssen Cursor.PositionSie einen neuen Punkt verwenden und ihm einen neuen Punkt geben :

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

Sie können dies in Ihrer MainMethode tun , bevor Sie Ihr Formular erstellen.

adrianbanks
quelle
16

Um Ihr spezielles Beispiel zu beantworten:

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

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

Vergessen Sie nicht, using System.Windows.Forms;den Verweis hinzuzufügen und hinzuzufügen (klicken Sie mit der rechten Maustaste auf Verweise> Verweis hinzufügen> Registerkarte .NET> Systems.Windows.Forms> ok).

Benjamin Crouzier
quelle
11
System.Windows.Forms.Control.MousePosition

Ruft die Position des Mauszeigers in Bildschirmkoordinaten ab. "Die Position-Eigenschaft ist identisch mit der Control.MousePosition-Eigenschaft."

James
quelle
4
Keine Notwendigkeit, unhöflich zu sein. Dies ist eine Alternative zur primären Antwort. Ich bevorzuge nur diesen einen, weil der andere 'Cursor.Position' wie ein Texttyp-Cursor IMHO klingt und 'MousePosition' offensichtlicher ist.
James
3
@ Jan Dvorak sicher, und ja, ich fand es vielleicht hilfreich. Ich hätte so etwas gesagt: "Könnten Sie bitte ein paar weitere Informationen hinzufügen, damit ich sehen kann, wie sich dies von den zuvor gegebenen Antworten unterscheiden kann?"
James
@ JanDvorak Wenn du denkst, dass Einzeiler nicht helfen (übrigens auch), hängt es nicht davon ab, ob die Frage 1 Tag alt oder 3 Jahre alt ist. +1 für alternativen Ansatz.
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
quelle
3

Initialisieren Sie den aktuellen Cursor. Verwenden Sie es, um die Position von X und Y zu erhalten

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

Wenn Sie die aktuelle Position im Formularbereich ermitteln müssen (experimentell ermittelt), versuchen Sie Folgendes:

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

Obwohl durch Experimentieren 8 und 30 ganze Zahlen gefunden wurden.

Wäre toll, wenn jemand erklären könnte, warum genau diese Zahlen ^.


Es gibt auch eine andere Variante (wenn man bedenkt, dass sich Code im CodeBehind von Form befindet):

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
quelle
0

Sie müssen auch die folgenden Importe haben, um die DLL zu importieren

using System.Runtime.InteropServices;
using System.Diagnostics;
Austin Traphofner
quelle