zoukankan      html  css  js  c++  java
  • 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同级目录下

  • 相关阅读:
    Android:Service的非绑定式的创建和生命周期
    [NHibernate]缓存(NHibernate.Caches)
    [NHibernate]Parent/Child
    [NHibernate]关联映射
    [NHibernate]集合类(Collections)映射
    [NHibernate]O/R Mapping基础
    [NHibernate]持久化类(Persistent Classes)
    [js]uploadify结合jqueryUI弹出框上传,js中的冒出的bug,又被ie坑了
    [NHibernate]ISessionFactory配置
    [Nhibernate]体系结构
  • 原文地址:https://www.cnblogs.com/liang123/p/6325908.html
Copyright © 2011-2022 走看看