Mendapatkan posisi mouse di c #

117

Bagaimana cara mendapatkan posisi mouse? Saya menginginkannya dalam posisi layar.

Saya memulai program saya, saya ingin mengatur ke posisi mouse saat ini.

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

Edit: Ini harus terjadi sebelum formulir dibuat.

Athiwat Chunlakhan
sumber

Jawaban:

180

Anda harus menggunakan System.Windows.Forms.Cursor.Position : "Sebuah Titik yang mewakili posisi kursor dalam koordinat layar."

RichieHindle
sumber
2
Cursor.Position menampilkan cara tooltip saya di luar layar: (-
Thomas Eyde
25
@ Thomas Eyde: Saya menebak, tetapi mungkinkah itu karena posisi mouse ada di koordinat layar dan posisi tooltip Anda relatif terhadap jendela induknya? Anda mungkin perlu menggunakan PointToClient.
RichieHindle
Ya, itulah yang harus saya lakukan.
Thomas Eyde
88

Jika Anda tidak ingin mereferensikan Formulir, Anda dapat menggunakan interop untuk mendapatkan posisi kursor:

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
sumber
1
Bagaimana cara merujuk tipe POINT?
Manish Dubey
2
Tambahkan referensi ke System.Drawing
Bose_geek
1
solusi yang luar biasa. Tetapi Anda tidak perlu mendeklarasikan struct POINT. Cukup gunakan namespace Win32Interop.Structs.
Manpreet Singh Dhillon
@ManpreetSinghDhillon Apakah Win32Interop.Structs tersedia di .Net Core? Jika ya, di bawah referensi paket / sistem nuget yang manakah?
demonicdaron
@ManpreetSinghDhillon Menggunakan struct Anda sendiri memungkinkan Anda untuk mentransmisikan secara implisit ke Titik apa pun yang Anda gunakan dalam kode Anda, itu sedikit lebih halus. Jika Win32Interop.Structs cukup untuk Anda, silakan lanjutkan dan gunakan saja!
Mo0gles
17

Cursor.Position akan mendapatkan posisi layar mouse saat ini (jika Anda berada dalam Control , properti MousePosition juga akan mendapatkan nilai yang sama).

Untuk mengatur posisi mouse, Anda harus menggunakan Cursor.Positiondan memberinya Poin baru :

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

Anda dapat melakukan ini dalam Mainmetode Anda sebelum membuat formulir Anda.

adrianbanks
sumber
16

Untuk menjawab contoh spesifik Anda:

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

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

Jangan lupa untuk menambahkan using System.Windows.Forms;, dan menambahkan referensi ke dalamnya (klik kanan pada referensi> tambahkan referensi> tab .NET> Systems.Windows.Forms> ok)

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

Mendapatkan posisi kursor mouse dalam koordinat layar. "Properti Posisi identik dengan properti Control.MousePosition."

James
sumber
4
Tidak perlu bersikap kasar. Ini adalah alternatif dari jawaban utama. Saya lebih suka yang ini karena 'Cursor.Position' yang lain terdengar seperti kursor jenis teks IMHO dan 'MousePosition' lebih jelas.
Yakobus
3
@ Jan Dvorak yakin, dan ya saya pikir itu mungkin membantu. Saya akan mengatakan sesuatu seperti ini, "Bisakah Anda menyertakan sedikit informasi lebih lanjut sehingga saya dapat melihat bagaimana ini mungkin berbeda dari jawaban yang diberikan sebelumnya?"
Yakobus
@JanDvorak Jika menurut Anda satu baris tidak membantu (btw, mereka membantu) maka itu tidak tergantung pada apakah pertanyaan itu berumur 1 hari atau 3 tahun. 1 untuk pendekatan alternatif.
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
sumber
3

Inisialisasi kursor saat ini. Gunakan untuk mendapatkan posisi X dan Y

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

Jika Anda perlu mendapatkan posisi saat ini di area formulir (didapat secara eksperimental), coba:

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

Meskipun, 8 dan 30 bilangan bulat ditemukan dengan bereksperimen.

Akan luar biasa jika seseorang bisa menjelaskan mengapa tepatnya angka-angka ini ^.


Juga, ada varian lain (mengingat kode ada di CodeBehind Formulir):

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

Anda juga harus memiliki impor berikut untuk mengimpor DLL

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