unity C#更改系统默认鼠标指针
最近项目需要替换鼠标的默认图标,实现的效果是初始状态为一种图标,点击鼠标左键要换成另一种图标,按网上通用的方法做了以后,隐藏鼠标指针,在指针的位置画一个图片就可以了,但不知道怎么回事,这种方法画的图标总是比真实鼠标的移动位置慢半拍,也就是有卡顿,鼠标移过去了缓一下画的图标才跟过来(这个问题在不同的电脑上卡顿程度不一样,估计是配置的问题)。
所以最近就实现了直接用windows API改系统图标的方式,不过这种方式的劣点有2个:
1、直接更改系统的鼠标图标,不只是针对某一个窗口,所以在程序退出时需要还原默认图标,不然鼠标一直是保持我们更改后的效果;
2、只针对pc项目。
一、导入包
using System.Runtime.InteropServices; using System;
二、光标资源加载函数
/*光标资源加载函数 * fileName为加载路径下的.cur文件 */ [DllImport("User32.DLL")] public static extern IntPtr LoadCursorFromFile(string fileName);
三、设置系统指针函数
/*设置系统指针函数(用hcur替换id定义的光标) * hcur用于表示指针或句柄的特定类型,可以用LoadCursorFromFile函数加载一个路径下的.cur指针文件 * id是系统光标标识符,例: * OCR_APPSTARTING:标准箭头和小的沙漏; * OCR_NORAAC:标准箭头; * OCR_CROSS:交叉十字线光标; * OCR_HAND:手的形状(WindowsNT5.0和以后版本); * OCR_HELP:箭头和向东标记; * OCR_IBEAM:I形梁; * OCR_NO:斜的圆; * OCR_SIZEALL:四个方位的箭头分别指向北、南、东、西; * OCR_SIZENESEW:双箭头分别指向东北和西南; * OCR_SIZENS:双箭头,分别指向北和南; * OCR_SIZENWSE:双箭头分别指向西北和东南; * OCR_SIZEWE:双箭头分别指向西和东; */ [DllImport("User32.DLL")] public static extern bool SetSystemCursor(IntPtr hcur, uint id); public const uint OCR_NORMAL = 32512;
四、查询或设置的系统级参数函数(用于重置系统光标)
/*查询或设置的系统级参数函数 * uiAction该参数指定要查询或设置的系统级参数,SPI_SETCURSORS:重置系统光标 * fWinIni该参数指定在更新用户配置文件之后广播SPI_SENDWININICHANGE消息 */ [DllImport("User32.DLL")] public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, IntPtr pvParam, uint fWinIni); public const uint SPI_SETCURSORS = 87; public const uint SPIF_SENDWININICHANGE = 2;
五、设置或恢复
/*设置系统自带图标 * SetSystemCursor(Cursors.WaitCursor.CopyHandle(), OCR_NORMAL); */ /*设置外部图标文件 * SetSystemCursor(hcur_normal, OCR_NORMAL); */ public string path; void Start () { path = UnityEngine.Application.dataPath; int num = path.LastIndexOf("/"); path = path.Substring(0, num); } void FixedUpdate() { if (Input.GetMouseButtonDown(0)) { //鼠标点击图标 IntPtr hcur_click = LoadCursorFromFile(path + "/click.cur"); SetSystemCursor(hcur_click, OCR_NORMAL); } if (Input.GetMouseButtonUp(0)) { //正常状态图标 IntPtr hcur_normal = LoadCursorFromFile(path + "/normal.cur"); SetSystemCursor(hcur_normal, OCR_NORMAL); } } void OnApplicationQuit() { //恢复为系统默认图标 SystemParametersInfo(SPI_SETCURSORS, 0, IntPtr.Zero, SPIF_SENDWININICHANGE); }
六、将这个脚本挂在场景任意物体(全局不会销毁或隐藏的)上就可以了,再把你想替换的鼠标.cur文件click.cur和normal.cur(名字自定义)放在Assets同级目录下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架