Program Tip

WPF에서 현재 마우스 화면 좌표를 어떻게 얻습니까?

programtip 2020. 11. 22. 20:29
반응형

WPF에서 현재 마우스 화면 좌표를 어떻게 얻습니까?


화면에서 현재 마우스 조정을 얻는 방법은 무엇입니까? Mouse.GetPosition()요소의 mousePosition을 얻는 것만 알고 있지만 요소를 사용하지 않고 조정을 얻고 싶습니다.


Rachel의 대답에 대한 후속 조치.
WPF에서 마우스 화면 좌표를 가져올 수있는 두 가지 방법이 있습니다.

1. Windows Forms 사용. System.Windows.Forms에 대한 참조 추가

public static Point GetMousePositionWindowsForms()
{
    System.Drawing.Point point = Control.MousePosition;
    return new Point(point.X, point.Y);
}

2. Win32 사용

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetCursorPos(ref Win32Point pt);

[StructLayout(LayoutKind.Sequential)]
internal struct Win32Point
{
    public Int32 X;
    public Int32 Y;
};
public static Point GetMousePosition()
{
    Win32Point w32Mouse = new Win32Point();
    GetCursorPos(ref w32Mouse);
    return new Point(w32Mouse.X, w32Mouse.Y);
}

또는 순수 WPF에서는 PointToScreen을 사용 합니다 .

샘플 도우미 메서드 :

// Gets the absolute mouse position, relative to screen
Point GetMousePos(){
    return _window.PointToScreen(Mouse.GetPosition(_window))
}

화면이나 응용 프로그램을 기준으로 좌표를 원하십니까?

응용 프로그램 내에 있으면 다음을 사용하십시오.

Mouse.GetPosition(Application.Current.MainWindow);

그렇지 않은 경우 참조를 추가 System.Windows.Forms하고 사용할 수 있다고 생각합니다 .

System.Windows.Forms.Control.MousePosition;

다른 해상도, 여러 모니터가있는 컴퓨터 등에서 이러한 답변을 많이 시도하면 안정적으로 작동하지 않을 수 있습니다. 이는 모든 모니터로 구성된 전체보기 영역이 아니라 현재 화면을 기준으로 마우스 위치를 가져 오기 위해 변환을 사용해야하기 때문입니다. 이와 같은 것 ... ( "this"는 WPF 창).

var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice;
var mouse = transform.Transform(GetMousePosition());

public System.Windows.Point GetMousePosition()
{
    System.Drawing.Point point = System.Windows.Forms.Control.MousePosition;
    return new System.Windows.Point(point.X, point.Y);
}

이것은 양식을 사용하거나 DLL을 가져올 필요없이 작동합니다.

   using System.Windows;
   using System.Windows.Input;

    /// <summary>
    /// Gets the current mouse position on screen
    /// </summary>
    private Point GetMousePosition()
    {
        // Position of the mouse relative to the window
        var position = Mouse.GetPosition(Window);

        // Add the window position
        return new Point(position.X + Window.Left, position.Y + Window.Top);
    }

TimerDispatcher (WPF 타이머 아날로그)와 Windows "후크"의 조합을 사용하여 운영 체제에서 커서 위치를 파악할 수 있습니다.

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetCursorPos(out POINT pPoint);

포인트는 빛 struct입니다. X, Y 필드 만 포함합니다.

    public MainWindow()
    {
        InitializeComponent();

        DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer();
        dt.Tick += new EventHandler(timer_tick);
        dt.Interval = new TimeSpan(0,0,0,0, 50);
        dt.Start();
    }

    private void timer_tick(object sender, EventArgs e)
    {
        POINT pnt;
        GetCursorPos(out pnt);
        current_x_box.Text = (pnt.X).ToString();
        current_y_box.Text = (pnt.Y).ToString();
    }

    public struct POINT
    {
        public int X;
        public int Y;

        public POINT(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
    }

This solution is also resolving the problem with too often or too infrequent parameter reading so you can adjust it by yourself. But remember about WPF method overload with one arg which is representing ticks not milliseconds.

TimeSpan(50); //ticks

If you're looking for a 1 liner, this does well.

new Point(Mouse.GetPosition(mWindow).X + mWindow.Left, Mouse.GetPosition(mWindow).Y + mWindow.Top)

i add this for use with controls

   private void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
 var mousepos = new List<double> { e.GetPosition(ControlName).X, e.GetPosition(ControlName).Y };

}

Mouse.GetPosition(mWindow) gives you the mouse position relative to the parameter of your choice. mWindow.PointToScreen() convert the position to a point relative to the screen.

So mWindow.PointToScreen(Mouse.GetPosition(mWindow)) gives you the mouse position relative to the screen, assuming that mWindow is a window(actually, any class derived from System.Windows.Media.Visual will have this function), if you are using this inside a WPF window class, this should work.

참고URL : https://stackoverflow.com/questions/4226740/how-do-i-get-the-current-mouse-screen-coordinates-in-wpf

반응형