在 Visual Studio 2019 应用中使用现代链接选择光标图标

在 Visual Studio 2019 应用中使用现代链接选择光标图标

您好,我在 Visual Studio 2019 中构建了一个 Windows 窗体应用程序。我选择了手形光标图标,当我的光标悬停在按钮上时显示该图标。我的问题是 Visual Studio 2019 使用旧的手形图标,而不是 Windows 10 默认的新图标。我如何让 Visual Studio 2019 允许我使用所需的光标图标?

橙色框中的旧手形光标图标。

在此处输入图片描述

红色框中的新手形光标图标。这是我想要在 Visual Studio 2019 Winforms 项目中使用的光标。

在此处输入图片描述

答案1

我找到了一个解决方案,但它很糟糕。

无论出于什么原因,设置的标准光标Windows.Forms都包含一个预定义的“手形”光标,而不是用户在设置中选择的光标。这可能是为了与没有此类设置的旧 Windows 版本兼容,但无论如何,我认为您不能使用它。

下一个最好的办法是从 Windows 读取实际设置,找到光标文件的路径并使用它来创建一个“新”光标。

我发现获取该文件路径的唯一方法是通过注册表。在本例中:Registry.GetValue(@"HKEY_CURRENT_USER\Control Panel\Cursors", "Hand", null).ToString();

该类Cursor确实有一个接受游标路径的构造函数,但根据其他问题,它似乎实现得相当糟糕(例子)。它只能处理黑白的,而不能处理动画光标。

使用我上面链接的问题中的代码,最终结果看起来有点像这样:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private static Cursor LoadCustomCursor(string path)
    {
        IntPtr hCurs = LoadCursorFromFile(path);
        if (hCurs == IntPtr.Zero) throw new Win32Exception();
        var curs = new Cursor(hCurs);
        // Note: force the cursor to own the handle so it gets released properly
        var fi = typeof(Cursor).GetField("ownHandle", BindingFlags.NonPublic | BindingFlags.Instance);
        fi.SetValue(curs, true);
        return curs;
    }

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern IntPtr LoadCursorFromFile(string path);

    private void Form1_Load(object sender, EventArgs e)
    {
        string path = Registry.GetValue(@"HKEY_CURRENT_USER\Control Panel\Cursors", "Hand", null).ToString();
        var hand = LoadCustomCursor(path);
        button1.Cursor = hand;
    }
}

在我的系统上,这似乎对静态和动画光标都有效。当然,最好添加一些错误处理。

相关内容