答案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;
}
}
在我的系统上,这似乎对静态和动画光标都有效。当然,最好添加一些错误处理。