以编程方式在Windows中更改自定义鼠标指针?

14
我正在尝试更改Windows光标(默认为Windows自定义方案)为我的自定义光标(命名为Cut the rope):

enter image description here

有没有什么想法可以将所有光标(箭头、忙碌、帮助选择、链接选择等)都更改为我的《割绳子》游戏中的图案?

2个回答

10
如果您想更改默认的鼠标光标主题:

enter image description here

您可以在注册表中更改它:
有三个主要的注册表键起作用。
1. 注册表键 HKEY_CURRENT_USER\Control Panel\Cursors 包含活动用户光标。 1a) 此下面的值是不同类型的光标。 1b) 方案源指定当前正在使用的光标方案的类型。
不同的值为:
"0" - Windows 默认值 "1" - 用户方案 "2" - 系统方案
2. 注册表键 HKEY_CURRENT_USER\Control Panel\Cursors 包含用户定义的光标方案(即方案源= 1)。 3. 注册表键 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Schemes 包含系统光标方案(即方案源= 2)。

enter image description here

如果您已经将HKCU\Control Panel\Cursors中的光标类型之一的路径更改,并意识到它没有起作用。 您是正确的,仅更新一个键 - 例如HKCU\Control Panel\Cursors\Arrow - 是不够的。 您必须告诉Windows加载新光标。
这就是SystemParametersInfo调用发挥作用的地方。 为了尝试此操作,请继续将HKCU\Control Panel\Cursors\Arrow更改为C:\WINDOWS\Cursors\appstar3.ani(假设您拥有此图标),然后调用SystemParametersInfo。
在AutoHotKey脚本中:
SPI_SETCURSORS := 0x57
result := DllCall("SystemParametersInfo", "UInt", SPI_SETCURSORS, "UInt", 0, "UInt", 0, "UInt", '0')
MsgBox Error Level: %ErrorLevel% `nLast error: %A_LastError%`nresult: %result%

翻译成 C#:

[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, uint pvParam, uint fWinIni);
 
const int SPI_SETCURSORS = 0x0057;
const int SPIF_UPDATEINIFILE = 0x01;
const int SPIF_SENDCHANGE = 0x02;

调用它:

SystemParametersInfo(SPI_SETCURSORS, 0, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);

更改为默认的Windows光标

现在是棘手的部分。如果您查看HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Schemes,您会注意到“Windows Default”被定义为“,,,,,,,,,,,,,”或者换句话说没有指向实际光标的指针!

现在该怎么办?不用担心。您所要做的就是将不同的光标类型设置为空字符串,然后像往常一样进行SystemParametersInfo调用。事实上,您可以在任何方案中将任何光标类型设置为空字符串,并且Windows将其默认为“Windows Default”方案中的等效光标。

REF:

https://thebitguru.com/articles/programmatically-changing-windows-mouse-cursors/3

https://social.msdn.microsoft.com/Forums/vstudio/en-US/977e2f40-3222-4e13-90ea-4e8d0cdf289c/faq-item-how-to-change-the-systems-cursor-using-visual-cnet?forum=csharpgeneral


我尝试改变数值,但没有任何反应,光标仍然是默认的。 - Hoang Viet
我在这里遇到了一些错误:http://i.imgur.com/Agns2vV.png。pvParam不接受空值。我尝试将pvParam的值更改为“0”,然后它可以正常工作。非常感谢! - Hoang Viet
@HoangViet 嘿,伙计,你能把这个标记为答案吗(这将让每个人知道你的问题已经解决,并且标记正确答案还会给你一些声望点数)。勾选框位于此答案左侧的上/下投票箭头下方。看看吧,很高兴它对你有用。 - Jeremy Thompson
我做到了。非常感激你的帮助。 - Hoang Viet
@Jeremy Thompson,有没有其他方法可以在Windows的方案之间切换?我想编写一个AutoHotkey脚本来反映所选语言的光标:黑色光标,小心,您处于备用键盘布局!LeftAlt + Shift,白色光标,好的,您可以正常输入。语言栏距离大屏幕太远,但鼠标指针通常靠近您尝试输入的位置。 - Leeroy
3
@JeremyThompson 我成功地通过逐个设置每个光标来实现。这是一篇含有AutoHotkey代码和更多细节的主旨:光标语言指示器-反映鼠标指针外观中的键盘布局更改 - Leeroy

2
你可以这样做。获取 Cursor.cur 文件以加载自定义光标。在 MouseLeave 事件中将表单的默认光标设置为默认值。
public static Cursor ActuallyLoadCursor(String path)
    {
        return new Cursor(LoadCursorFromFile(path));
    }

    [DllImport("user32.dll")]
    private static extern IntPtr LoadCursorFromFile(string fileName);

Button btn = new Button();
btn.MouseLeave += Btn_MouseLeave;
btn.Cursor = ActuallyLoadCursor("Cursor.cur");

private static void Btn_MouseLeave(object sender, EventArgs e)
    {
        this.Cursor = Cursors.Default;
    }

1
我想要更改所有的Windows光标,而不仅仅是表单。感谢您的帮助! - Hoang Viet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接