C #에서 마우스 위치 가져 오기


117

마우스 위치는 어떻게 얻습니까? 화면 위치 측면에서 원합니다.

현재 마우스 위치로 설정하려는 프로그램을 시작합니다.

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

편집 : 양식이 생성되기 전에 발생해야합니다.

답변:


180

System.Windows.Forms.Cursor.Position : "화면 좌표에서 커서의 위치를 ​​나타내는 Point"를 사용해야 합니다.


2
Cursor.Position은 내 툴팁을 화면 밖으로 표시합니다. : (
Thomas Eyde

25
@Thomas Eyde : 추측 하건데 마우스 위치가 화면 좌표에 있고 툴팁 위치가 부모 창에 상대적이기 때문일 수 있습니까? 을 사용해야 할 수도 있습니다 PointToClient.
RichieHindle 2011 년

네, 그게 제가해야 할 일입니다.
Thomas Eyde 2011 년

88

양식을 참조하지 않으려면 interop을 사용하여 커서 위치를 가져올 수 있습니다.

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 유형은 어떻게 참조하나요?
Manish Dubey

2
System.Drawing에 참조를 추가
Bose_geek

1
멋진 솔루션입니다. 그러나 struct POINT를 선언 할 필요는 없습니다. Win32Interop.Structs 네임 스페이스를 사용하십시오.
Manpreet Singh Dhillon

@ManpreetSinghDhillon .Net Core에서 Win32Interop.Structs를 사용할 수 있습니까? 그렇다면 어떤 너겟 패키지 / 시스템 참조 아래에 있습니까?
demonicdaron

@ManpreetSinghDhillon 자신의 구조체를 사용하면 코드에서 사용하는 Point에 암시 적으로 캐스팅 할 수 있습니다. 조금 더 부드럽습니다. Win32Interop.Structs가 충분하다면 계속해서 대신 사용하십시오!
Mo0gles

17

Cursor.Position 은 마우스의 현재 화면 위치를 가져옵니다 ( Control 에있는 경우 MousePosition 속성도 동일한 값을 얻습니다).

마우스 위치를 설정하려면 Cursor.PositionPoint 를 사용 하고 지정해야합니다 .

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

Main양식을 작성하기 전에 방법 에서이 작업을 수행 할 수 있습니다 .


16

구체적인 예에 ​​답하려면 :

// 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;추가하고 참조를 추가하는 것을 잊지 마십시오 (참조를 마우스 오른쪽 버튼으로 클릭> 참조 추가> .NET 탭> Systems.Windows.Forms> 확인).


12
System.Windows.Forms.Control.MousePosition

화면 좌표에서 마우스 커서의 위치를 ​​가져옵니다. "Position 속성은 Control.MousePosition 속성과 동일합니다."


4
무례 할 필요가 없습니다. 이것은 기본 답변에 대한 대안입니다. 다른 'Cursor.Position'이 텍스트 유형 커서 IMHO 및 'MousePosition'처럼 들리기 때문에 이것을 선호합니다.
제임스

3
@Jan Dvorak은 물론 도움이 될 것이라고 생각했습니다. "이전에 제공된 답변과 어떻게 다른지 확인할 수 있도록 약간의 추가 정보를 포함 해 주시겠습니까?"와 같은 말을했을 것입니다.
James

@JanDvorak one-liners가 도움이되지 않는다고 생각한다면 (btw, 그들은 그렇습니다) 질문이 1 일 전인지 3 년 전인지에 의존하지 않습니다. 대체 접근 방식의 경우 +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

현재 커서를 초기화합니다. 그것을 사용하여 X와 Y의 위치를 ​​얻습니다.

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

3

양식 영역에서 현재 위치를 가져와야하는 경우 (실험적으로) 시도해보십시오.

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

비록 8 개30 정수는 실험에 의해 발견되었다.

누군가가 왜 정확히이 숫자를 설명 할 수 있다면 멋질 것입니다 ^.


또한 다른 변형이 있습니다 (코드가 Form의 CodeBehind에 있음을 고려).

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.