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.