Obtendo a posição do mouse em c #

117

Como obtenho a posição do mouse? Eu quero isso em termos de posição da tela.

Eu inicio o meu programa que desejo definir para a posição atual do mouse.

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

Editar: Isso deve acontecer antes de o formulário ser criado.

Athiwat Chunlakhan
fonte

Respostas:

180

Você deve usar System.Windows.Forms.Cursor.Position : "Um ponto que representa a posição do cursor nas coordenadas da tela."

RichieHindle
fonte
2
Cursor.Position exibe minha dica de ferramenta bem fora da tela: (-
Thomas Eyde
25
@Thomas Eyde: Estou supondo, mas poderia ser porque a posição do mouse está nas coordenadas da tela e a posição da dica de ferramenta é relativa à janela pai? Você pode precisar usar PointToClient.
RichieHindle de
Sim, era o que eu tinha que fazer.
Thomas Eyde
88

Se não quiser fazer referência ao Formulários, você pode usar a interoperabilidade para obter a posição do 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
fonte
1
Como referir o tipo de PONTO?
Manish Dubey
2
Adicionar referência a System.Drawing
Bose_geek
1
solução incrível. Mas você não precisa declarar struct POINT. Basta usar o namespace Win32Interop.Structs.
Manpreet Singh Dhillon
@ManpreetSinghDhillon O Win32Interop.Structs está disponível no .Net Core? Em caso afirmativo, em qual pacote nuget / referência de sistema?
demonicdaron 01 de
@ManpreetSinghDhillon Usar sua própria estrutura permite que você faça um cast implícito para qualquer ponto que usar em seu código, é um pouco mais suave. Se Win32Interop.Structs for suficiente para você, vá em frente e use-o!
Mo0gles
17

Cursor.Position obterá a posição atual da tela do mouse (se você estiver em um Controle , a propriedade MousePosition também obterá o mesmo valor).

Para definir a posição do mouse, você terá que usar Cursor.Positione dar a ele um novo ponto :

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

Você pode fazer isso em seu Mainmétodo antes de criar seu formulário.

Adrianbanks
fonte
16

Para responder ao seu exemplo 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);

Não se esqueça de adicionar using System.Windows.Forms;e adicionar a referência a ele (clique com o botão direito em referências> adicionar referência> guia .NET> Systems.Windows.Forms> ok)

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

Obtém a posição do cursor do mouse nas coordenadas da tela. "A propriedade Position é idêntica à propriedade Control.MousePosition."

James
fonte
4
Não precisa ser rude. Esta é uma alternativa à resposta primária. Eu prefiro este porque o outro 'Cursor.Position' soa como um cursor de tipo de texto IMHO e 'MousePosition' é mais óbvio.
James
3
@Jan Dvorak com certeza, e sim, eu pensei que talvez fosse útil. Eu teria dito algo como "Por favor, você poderia incluir mais algumas informações para que eu possa ver como isso pode ser diferente das respostas dadas anteriormente?"
James
@JanDvorak Se você acha que one-liners não ajudam (aliás, ajudam), então não depende se a pergunta tem 1 dia ou 3 anos. 1 para abordagem alternativa.
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
fonte
3

Inicialize o cursor atual. Use-o para obter a posição de X e Y

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

Se você precisa obter a posição atual na área do formulário (obtida experimentalmente), tente:

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

Embora, 8 e 30 inteiros tenham sido encontrados experimentando.

Seria incrível se alguém pudesse explicar por que exatamente esses números ^.


Além disso, há outra variante (considerando que o código está no CodeBehind do 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);
F8ER
fonte
0

Você também deve ter as seguintes importações para importar a DLL

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