Nhận vị trí chuột trong c #


117

Làm thế nào để tôi có được vị trí chuột? Tôi muốn nó về vị trí màn hình.

Tôi bắt đầu chương trình của mình, tôi muốn đặt vị trí chuột hiện tại.

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

Chỉnh sửa: Điều này phải xảy ra trước khi biểu mẫu được tạo.

Câu trả lời:


180

Bạn nên sử dụng System.Windows.Forms.Cursor.Position : "Điểm đại diện cho vị trí của con trỏ trong tọa độ màn hình."


2
Cursor.Position hiển thị cách tooltip tôi offscreen: (-
Thomas Eyde

25
@Thomas Eyde: Tôi đang đoán, nhưng đó có thể là do vị trí chuột nằm trong tọa độ màn hình và vị trí chú giải công cụ của bạn có liên quan đến cửa sổ mẹ của nó không? Bạn có thể cần phải sử dụng PointToClient.
RichieHindle

Vâng, đó là những gì tôi phải làm.
Thomas Eyde

88

Nếu bạn không muốn tham chiếu Biểu mẫu, bạn có thể sử dụng interop để lấy vị trí con trỏ:

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
Làm thế nào để tham khảo loại POINT?
Manish Dubey

2
Thêm tham chiếu vào System.Drawing
Bose_geek

1
giải pháp tuyệt vời. Nhưng bạn không cần khai báo struct POINT. Chỉ cần sử dụng không gian tên Win32Interop.Structs.
Manpreet Singh Dhillon

@ManpreetSinghDhillon Các sản phẩm Win32Interop.Struct có sẵn trong .Net Core không? Nếu có, tham chiếu gói / hệ thống nuget nào?
demonicdaron

@ManpreetSinghDhillon Sử dụng cấu trúc của riêng bạn cho phép bạn ẩn nó đến bất kỳ Điểm nào bạn sử dụng trong mã của mình, nó mượt mà hơn một chút. Nếu Win32Interop.Structs là đủ cho bạn thì hãy tiếp tục và sử dụng nó thay thế!
Mo0gles

17

Cursor.Position sẽ nhận được độ độc màn hình hiện tại của chuột (nếu bạn đang ở trong Control , MousePosition cũng sẽ nhận được giá trị tương tự).

Để đặt vị trí chuột, bạn sẽ phải sử dụng Cursor.Positionvà cung cấp cho nó một Điểm mới :

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

Bạn có thể thực hiện điều này trong Mainphương pháp của mình trước khi tạo biểu mẫu.


16

Để trả lời ví dụ cụ thể của bạn:

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

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

Đừng quên thêm using System.Windows.Forms;và thêm tham chiếu vào nó (nhấp chuột phải vào tham chiếu> thêm tham chiếu> tab .NET> Systems.Windows.Forms> ok)


12
System.Windows.Forms.Control.MousePosition

Nhận vị trí của con trỏ chuột trong tọa độ màn hình. "Thuộc tính Vị trí giống với thuộc tính Control.MousePosition."


4
Không cần phải thô lỗ. Đây là một thay thế cho câu trả lời chính. Tôi chỉ thích cái này hơn vì 'Cursor.Position' khác nghe giống như con trỏ kiểu văn bản IMHO và 'MousePosition' rõ ràng hơn.
James

3
@Jan Dvorak chắc chắn, và vâng, tôi nghĩ nó có thể hữu ích. Tôi sẽ nói điều gì đó như thế này "Vui lòng cung cấp thêm một chút thông tin để tôi có thể thấy điều này có thể khác với các câu trả lời đã đưa ra trước đây như thế nào?"
James

@JanDvorak Nếu bạn cho rằng một lớp lót không giúp ích gì (btw, họ có) thì nó không phụ thuộc vào việc câu hỏi là 1 ngày tuổi hay 3 năm tuổi. +1 cho cách tiếp cận thay thế.
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

Khởi tạo con trỏ hiện tại. Sử dụng nó để lấy vị trí của X và Y

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

3

Nếu bạn cần có được vị trí hiện tại trong khu vực của biểu mẫu (đã thử nghiệm), hãy thử:

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

Mặc dù, 830 số nguyên đã được tìm thấy bằng thử nghiệm.

Sẽ thật tuyệt nếu ai đó có thể giải thích tại sao chính xác những con số này ^.


Ngoài ra, có một biến thể khác (xem xét mã nằm trong CodeBehind của Biểu mẫu):

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

Bạn cũng phải có các lần nhập sau để nhập DLL

using System.Runtime.InteropServices;
using System.Diagnostics;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.