C # 'da fare konumunu alma


117

Fare konumunu nasıl elde ederim? Ekran konumu açısından istiyorum.

Programımı başlatıyorum Mevcut fare konumuna ayarlamak istiyorum.

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

Düzenleme: Bu, form oluşturulmadan önce gerçekleşmelidir.

Yanıtlar:


180

System.Windows.Forms.Cursor.Position kullanmalısınız : "Ekran koordinatlarında imlecin konumunu temsil eden bir nokta."


2
İmleç Konum, araç ipucumu ekran dışında görüntülüyor: (-
Thomas Eyde

25
@Thomas Eyde: Tahmin ediyorum, ama bunun nedeni fare konumunun ekran koordinatlarında olması ve ipucu konumunuzun ana pencereye göre olması olabilir mi? Kullanmanız gerekebilir PointToClient.
RichieHindle

Evet, yapmam gereken buydu.
Thomas Eyde

88

Formlara başvurmak istemiyorsanız, imleç konumunu almak için birlikte çalışmayı kullanabilirsiniz:

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
POINT türüne nasıl başvurulur?
Manish Dubey

2
System.Drawing'e referans ekleyin
Bose_geek

1
harika çözüm. Ama yapı POINT'i bildirmenize gerek yok. Sadece Win32Interop.Structs ad alanını kullanın.
Manpreet Singh Dhillon

@ManpreetSinghDhillon Win32Interop.Structs .Net Core'da mevcut mu? Evetse, hangi nuget paketi / sistem referansı altında?
demonicdaron

@ManpreetSinghDhillon Kendi yapınızı kullanmak, onu kodunuzda kullandığınız Noktaya örtük olarak aktarmanıza izin verir, biraz daha pürüzsüzdür. Win32Interop.Structs sizin için yeterliyse, devam edin ve onun yerine kullanın!
Mo0gles


16

Spesifik örneğinize cevap vermek için:

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

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

using System.Windows.Forms;Eklemeyi ve referansı eklemeyi unutmayın (referanslara sağ tıklayın> referans ekle> .NET sekmesi> Systems.Windows.Forms> ok)


12
System.Windows.Forms.Control.MousePosition

Ekran koordinatlarında fare imlecinin konumunu alır. "Position özelliği Control.MousePosition özelliğiyle aynıdır."


4
Kaba olmaya gerek yok. Bu, birincil cevaba bir alternatiftir. Ben sadece bunu tercih ediyorum çünkü diğer 'Cursor.Position' bir metin tipi imleci IMHO gibi geliyor ve 'MousePosition' daha açık.
James

3
@Jan Dvorak elbette, ve evet yararlı olabileceğini düşündüm. Şöyle bir şey söylerdim "Lütfen biraz daha bilgi ekleyebilir misiniz, böylece bunun daha önce verilen cevaplardan ne kadar farklı olabileceğini görebilir miyim?"
James

@JanDvorak Tek satırlıkların yardımcı olmadığını düşünüyorsanız (btw yaparlar), sorunun 1 günlük veya 3 yaşında olmasına bağlı değildir. Alternatif yaklaşım için +1.
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

Mevcut imleci başlatın. X ve Y'nin konumunu elde etmek için kullanın

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

3

Form alanında mevcut pozisyonu almanız gerekiyorsa (deneysel olarak var), şunu deneyin:

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

Her ne kadar deney yapılarak 8 ve 30 tam sayı bulundu.

Birisi neden tam olarak bu sayıları açıklayabilirse harika olurdu ^.


Ayrıca, başka bir varyant daha var (kodun Form'un CodeBehind'de olduğu düşünülüyor):

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

DLL dosyasını içe aktarmak için aşağıdaki içe aktarımlara da sahip olmalısınız

using System.Runtime.InteropServices;
using System.Diagnostics;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.