Obtener la posición del mouse en c #

117

¿Cómo obtengo la posición del mouse? Lo quiero en términos de posición en pantalla.

Comienzo mi programa y quiero establecer la posición actual del mouse.

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

Editar: esto debe suceder antes de que se cree el formulario.

Athiwat Chunlakhan
fuente

Respuestas:

180

Debe utilizar System.Windows.Forms.Cursor.Position : "Un punto que representa la posición del cursor en las coordenadas de la pantalla".

RichieHindle
fuente
2
Cursor.Position muestra mi información sobre herramientas fuera de la pantalla: (-
Thomas Eyde
25
@Thomas Eyde: Supongo, pero ¿podría deberse a que la posición del mouse está en las coordenadas de la pantalla y la posición de la información sobre herramientas es relativa a su ventana principal? Puede que necesite utilizar PointToClient.
RichieHindle
Sí, eso es lo que tenía que hacer.
Thomas Eyde
88

Si no desea hacer referencia a los formularios, puede usar la interoperabilidad para obtener la posición del cursor:

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
fuente
1
¿Cómo referir el tipo de PUNTO?
Manish Dubey
2
Agregar referencia a System.Drawing
Bose_geek
1
impresionante solución. Pero no necesitas declarar struct POINT. Simplemente use el espacio de nombres Win32Interop.Structs.
Manpreet Singh Dhillon
@ManpreetSinghDhillon ¿Win32Interop.Structs está disponible en .Net Core? En caso afirmativo, ¿bajo qué paquete nuget / referencia del sistema?
demonicdaron
@ManpreetSinghDhillon Usar su propia estructura le permite convertirlo implícitamente en cualquier punto que use en su código, es un poco más suave. Si Win32Interop.Structs es suficiente para ti, ¡adelante, úsala en su lugar!
Mo0gles
17

Cursor.Position obtendrá la posición de pantalla actual del mouse (si está en un Control , la propiedad MousePosition también obtendrá el mismo valor).

Para establecer la posición del mouse, tendrá que usar Cursor.Positiony darle un nuevo Punto :

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

Puede hacer esto en su Mainmétodo antes de crear su formulario.

adrianbanks
fuente
16

Para responder a su ejemplo específico:

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

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

No olvide agregar using System.Windows.Forms;y agregar la referencia (haga clic derecho en referencias> agregar referencia> pestaña .NET> Systems.Windows.Forms> ok)

Benjamin Crouzier
fuente
12
System.Windows.Forms.Control.MousePosition

Obtiene la posición del cursor del mouse en las coordenadas de la pantalla. "La propiedad Position es idéntica a la propiedad Control.MousePosition".

James
fuente
4
No hay necesidad de ser grosero. Esta es una alternativa a la respuesta principal. Simplemente prefiero este porque el otro 'Cursor.Position' suena como un cursor de tipo de texto en mi humilde opinión y 'MousePosition' es más obvio.
James
3
@Jan Dvorak seguro, y sí, pensé que tal vez sería útil. Habría dicho algo como esto "Por favor, ¿podría incluir un poco más de información para que pueda ver en qué puede diferir de las respuestas dadas anteriormente?"
James
@JanDvorak Si cree que las frases ingeniosas no ayudan (por cierto, lo hacen), entonces no depende de si la pregunta tiene 1 día o 3 años. +1 para enfoque alternativo.
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
fuente
3

Inicializa el cursor actual. Úselo para obtener la posición de X e Y

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

Si necesita obtener la posición actual en el área del formulario (obtenido experimentalmente), intente:

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

Aunque, se encontraron 8 y 30 enteros experimentando.

Sería increíble si alguien pudiera explicar por qué exactamente estos números ^.


Además, hay otra variante (considerando que el código está en Form's CodeBehind):

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

También debe tener las siguientes importaciones para poder importar la DLL

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