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.

Respostas:


180

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


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

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.


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)


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


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

}


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;

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

0

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

using System.Runtime.InteropServices;
using System.Diagnostics;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.