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.

Odpowiedzi:


180

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


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

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.


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)


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


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

}


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;

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

0

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

using System.Runtime.InteropServices;
using System.Diagnostics;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.