Pobieranie pozycji myszy w języku C #

117

Jak uzyskać pozycję myszy? Chcę tego pod względem pozycji ekranu.

Uruchamiam program, który chcę ustawić w bieżącej pozycji myszy.

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

Edycja: musi to nastąpić przed utworzeniem formularza.

Athiwat Chunlakhan
źródło

Odpowiedzi:

180

Powinieneś użyć System.Windows.Forms.Cursor.Position : "Punkt, który reprezentuje położenie kursora we współrzędnych ekranu."

RichieHindle
źródło
2
Cursor.Position wyświetla moją podpowiedź poza ekranem: (-
Thomas Eyde,
25
@Thomas Eyde: Zgaduję, ale czy może to być spowodowane tym, że pozycja myszy jest zgodna ze współrzędnymi na ekranie, a pozycja podpowiedzi jest zależna od jej okna nadrzędnego? Może być konieczne użycie PointToClient.
RichieHindle
Tak, to właśnie musiałem.
Thomas Eyde
88

Jeśli nie chcesz odwoływać się do Forms, możesz użyć interop, aby uzyskać pozycję kursora:

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
źródło
1
Jak odnieść się do typu PUNKTU?
Manish Dubey
2
Dodaj odniesienie do System.Drawing
Bose_geek
1
niesamowite rozwiązanie. Ale nie musisz deklarować struktury POINT. Po prostu użyj przestrzeni nazw Win32Interop.Structs.
Manpreet Singh Dhillon
@ManpreetSinghDhillon Czy Win32Interop.Structs jest dostępny w .Net Core? Jeśli tak, pod jakim odniesieniem do pakietu / systemu nuget?
demonicdaron
@ManpreetSinghDhillon Korzystanie z własnej struktury pozwala na niejawne rzutowanie jej do dowolnego punktu używanego w kodzie, jest to nieco płynniejsze. Jeśli Win32Interop.Structs jest dla Ciebie wystarczający, to śmiało użyj go zamiast tego!
Mo0gles
17

Cursor.Position pobierze bieżące położenie myszy na ekranie (jeśli jesteś w Control , właściwość MousePosition również otrzyma tę samą wartość).

Aby ustawić pozycję myszy, będziesz musiał użyć Cursor.Positioni nadać mu nowy punkt :

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

Możesz to zrobić w swojej Mainmetodzie przed utworzeniem formularza.

adrianbanks
źródło
16

Aby odpowiedzieć na konkretny przykład:

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

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

Nie zapomnij dodać using System.Windows.Forms;i dodać do niego odwołania (kliknij prawym przyciskiem myszy odniesienia> dodaj odniesienie> zakładka .NET> Systems.Windows.Forms> ok)

Benjamin Crouzier
źródło
12
System.Windows.Forms.Control.MousePosition

Pobiera położenie kursora myszy we współrzędnych ekranowych. „Właściwość Position jest identyczna z właściwością Control.MousePosition”.

James
źródło
4
Nie musisz być niegrzeczny. To jest alternatywa dla podstawowej odpowiedzi. Po prostu wolę ten, ponieważ drugi „Cursor.Position” brzmi jak kursor tekstowy IMHO, a „MousePosition” jest bardziej oczywista.
James
3
@Jan Dvorak z pewnością i tak, pomyślałem, że może to być pomocne. Powiedziałbym coś takiego: „Czy mógłbyś podać trochę więcej informacji, abym mógł zobaczyć, jak mogą się one różnić od odpowiedzi udzielonych wcześniej?”
James
@JanDvorak Jeśli uważasz, że jednolinijki nie pomagają (przy okazji, tak), nie zależy to od tego, czy pytanie ma 1 dzień, czy 3 lata. +1 za alternatywne podejście.
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
źródło
3

Zainicjuj bieżący kursor. Użyj go, aby uzyskać pozycję X i Y

this.Cursor = new Cursor(Cursor.Current.Handle);
int posX = Cursor.Position.X;
int posY = Cursor.Position.Y;
DeathRs
źródło
3

Jeśli chcesz uzyskać aktualną pozycję w obszarze formularza (uzyskaną eksperymentalnie), spróbuj:

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

Chociaż eksperymentując, znaleziono 8 i 30 liczb całkowitych.

Byłoby wspaniale, gdyby ktoś mógł wyjaśnić, dlaczego dokładnie te liczby ^.


Istnieje również inny wariant (biorąc pod uwagę, że kod znajduje się w CodeBehind formularza):

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
źródło
0

Aby zaimportować bibliotekę DLL, musisz również mieć następujące importy

using System.Runtime.InteropServices;
using System.Diagnostics;
Austin Traphofner
źródło