猿问

将鼠标置于 UI 元素上

在我的桌面应用程序中,每当按下特定按钮时,我都想将鼠标移动到应用程序窗口的中心。为此,我获取主窗口的位置、宽度和高度,然后使用 User32.dll 根据这些值设置鼠标光标位置。


鼠标光标被移动,但它总是明显偏离中心。它的位置受位置、宽度和高度的影响,但在测量所需位置和设置之间似乎存在一些奇怪的缩放问题。基于这个问题及其重复,这就是我正在使用的:


  static public double GetWindowLeft(Window window)

    {

        if (window.WindowState == WindowState.Maximized)

        {

            var leftField = typeof(Window).GetField("_actualLeft", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

            return (double)leftField.GetValue(window);

        }

        else

            return window.Left;

    }


    static public double GetWindowTop(Window window)

    {

        if (window.WindowState == WindowState.Maximized)

        {

            var leftField = typeof(Window).GetField("_actualTop", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

            return (double)leftField.GetValue(window);

        }

        else

            return window.Top;


    }



    static public void SetPosition(int a, int b)

    {

        SetCursorPos(a, b);

    }


    [DllImport("User32.dll")]

    private static extern bool SetCursorPos(int X, int Y);


}

并在 MainWindow 方法中:


 private void CenterMouse(object sender, RoutedEventArgs e)

    {


        double top = UCMethods.GetWindowTop(this);

        double left = UCMethods.GetWindowLeft(this);


        SetPosition((int)(left+left+ActualWidth) / 2, (int)(top + top + ActualHeight) / 2);

    }

编辑:这似乎在我朋友的计算机上运行良好,但在我的计算机上有偏移。我离屏幕左上角 (0,0) 越远,鼠标光标在该方向上滞后越多(鼠标光标在左上角方向偏移)。这个问题怎么可能是设备特定的?


PIPIONE
浏览 199回答 2
2回答

三国纷争

这是解决方案:    [DllImport("User32.dll")]    private static extern bool SetCursorPos(int X, int Y);    public MainWindow()    {        InitializeComponent();    }    private void Button_Click(object sender, RoutedEventArgs e)    {        var left = Convert.ToInt32(GetActualLeft() + this.ActualWidth / 2);        var top = Convert.ToInt32(GetActuaTop() + this.ActualHeight / 2);        SetCursorPos(left, top);    }    double GetActualLeft()    {        if (this.WindowState == WindowState.Maximized)        {            var leftField = typeof(Window).GetField("_actualLeft", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);            return (double)leftField.GetValue(this);        }        else            return this.Left;    }    double GetActuaTop()    {        if (this.WindowState == WindowState.Maximized)        {            var topField = typeof(Window).GetField("_actualTop", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);            return (double)topField.GetValue(this);        }        else            return this.Top;    }

一只斗牛犬

我也在其他地方问过这个问题,并在那里的帮助下设法解决了这个问题。解决方案链接
随时随地看视频慕课网APP
我要回答