以编程方式更改Windows中的自定义鼠标光标?

时间:2017-01-18 07:45:41

标签: c# cursors

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

enter image description here

是否有任何想法将所有游标(箭头,忙碌,帮助选择,链接选择......)更改为我的剪切绳索?

3 个答案:

答案 0 :(得分:4)

如果要更改默认的鼠标光标主题:

enter image description here

您只需在注册表中更改它:

有三个主要的注册表项可供使用。

  1. 注册表项HKEY_CURRENT_USER \ Control Panel \ Cursors包含活动用户游标

    1a)这下面的值是不同类型的游标
    1b)Scheme Source指定当前正在使用的游标方案的类型。

    不同的值是:

    “0” - Windows默认

    “1” - 用户方案
    “2” - 系统方案

  2. 注册表项 HKEY_CURRENT_USER \ Control Panel \ Cursors 包含用户定义的游标方案(即Scheme Source = 1)

  3. 注册表项 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Control Panel \ Schemes 包含系统光标方案(即Scheme Source = 2)

  4. 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默认”方案中的等效字符。

    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

答案 1 :(得分:3)

你可以这样做。获取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;
    }

答案 2 :(得分:1)

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;

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

    private void button1_Click(object sender, EventArgs e) {
      Bitmap bmp = Properties.Resources.Image1;
      bmp.MakeTransparent(Color.White);
      IntPtr hIcon = bmp.GetHicon();
      Icon ico = Icon.FromHandle(hIcon);
      Cursor cur = new Cursor(hIcon);
      using (FileStream fs = new FileStream(@"c:\temp\test.cur", FileMode.Create, FileAccess.Write))
        ico.Save(fs);
      cur.Dispose();
      ico.Dispose();
      DestroyIcon(hIcon);

      // Test it
      cur = new Cursor(@"c:\temp\test.cur");
      this.Cursor = cur;
    }
    [DllImport("user32.dll")]
    extern static bool DestroyIcon(IntPtr handle);
  }
}

参考:release notes