将鼠标置于UI元素上

时间:2018-07-24 14:10:00

标签: c# wpf visual-studio xaml

感谢您的光临。

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

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

  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 个答案:

答案 0 :(得分:0)

这是解决方法:

def add_sheet(self, df, sheet, min_col, max_col, sheet_dim):
    index_positions = list(df.index.values)
    r = 1
    for x in index_positions:
        _row = df.loc[x].values
        c = min_col
        r += 1
        for val in _row:
            if c <= max_col:
                sheet.cell(row=r, column=c).value = val
                c += 1

答案 1 :(得分:0)

我也在其他地方问过这个问题,并设法从那里解决了这个问题。 Link to solution