IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Unity编辑器定制:更改系统默认鼠标图标

    u010019717发表于 2015-11-11 09:17:44
    love 0

    孙广东  2015.11.8

    这篇文章是 无意间 从网上的 看到的一篇文章, 个人角色挺有意思的。  当然了原理还是很简单的。

       直接用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;
            }
    
            void Update()   // 如果是在 FixedUpdate 内检测 会出现漏检的问题!
            {
                if (Input.GetMouseButtonDown(0))
                {
                    //鼠标点击图标
                    IntPtr hcur_click = LoadCursorFromFile(path + "/03.cur");
                    SetSystemCursor(hcur_click, OCR_NORMAL);
                }
    
                if (Input.GetMouseButtonUp(0))
                {
                    //正常状态图标
                    IntPtr hcur_normal = LoadCursorFromFile(path + "/01.cur");
                    SetSystemCursor(hcur_normal, OCR_NORMAL);
                }
            }
    
            void OnApplicationQuit()
            {
                //恢复为系统默认图标
                SystemParametersInfo(SPI_SETCURSORS, 0, IntPtr.Zero, SPIF_SENDWININICHANGE);
            }


    六、将这个脚本挂在场景任意物体(全局不会销毁或隐藏的)上就可以了,再把你想替换的鼠标.cur文件click.cur和normal.cur(名字自定义)放在Assets同级目录下,好了本篇unity3d教程到此结束,下篇我们再会!

    由于鼠标光标的截图 无法被捕捉到, 所以看不到效果图了!








    


沪ICP备19023445号-2号
友情链接