为了账号安全,请及时绑定邮箱和手机立即绑定

将鼠标置于 UI 元素上

将鼠标置于 UI 元素上

C#
PIPIONE 2021-10-24 19:49:18
在我的桌面应用程序中,每当按下特定按钮时,我都想将鼠标移动到应用程序窗口的中心。为此,我获取主窗口的位置、宽度和高度,然后使用 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) 越远,鼠标光标在该方向上滞后越多(鼠标光标在左上角方向偏移)。这个问题怎么可能是设备特定的?
查看完整描述

2 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

这是解决方案:


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

    }


查看完整回答
反对 回复 2021-10-24
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

我也在其他地方问过这个问题,并在那里的帮助下设法解决了这个问题。解决方案链接


查看完整回答
反对 回复 2021-10-24
  • 2 回答
  • 0 关注
  • 198 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信