关于c# 调用调用api改变custom cursor的方法。

原创 2013年12月03日 11:04:03

   今天遇到一个需求,需要用大量自定义图片根据不同情况来改变cursor的形状。由于在wpf页面中,调用c++的window.无法控制,只能改变系统鼠标的状态,在网络上查了相关资料发现并没有完整的实现例子,很多的例子肯定运行不了。故在这里整理下 发给大家。


1 需要调用的api 包括: 

   [DllImport("user32.dll")]
        static extern bool SetSystemCursor(IntPtr hcur, uint id);

   [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern IntPtr GetCursor();

        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr CopyIcon(IntPtr hInstance);

    [DllImport("User32.DLL")]
        public static extern bool SystemParametersInfo(uint uiAction, uint uiParam,
            IntPtr pvParam, uint fWinIni);



第一步添加图片:将该图片的build Action 改成Embedded Resource ;

在程序启动的时候 将图片载入到内存当中:

   public static IntPtr SIECURSORLeftBottom2RightTopArrowMouseCursor
        {
            get
            {
                if (sIECURSORLeftBottom2RightTopArrowMouseCursor == (IntPtr)0)
                {
                    Bitmap image = new Bitmap(asm.GetManifestResourceStream(SIECURSORLeftBottom2RightTopArrowImageResourseName));
                    sIECURSORLeftBottom2RightTopArrowMouseCursor = image.GetHicon();
                }
                return sIECURSORLeftBottom2RightTopArrowMouseCursor;
            }
        }

private static readonly Assembly asm = Assembly.GetExecutingAssembly(); 

        private const string SIECURSORLeftBottom2RightTopArrowImageResourseName = "图片路径"; 


 写一个static方法  

   public static void SetCursor(SIECURSOR siecursor)   // cursor 的enum 
        {


            IntPtr intPtr = default(IntPtr);
            switch (siecursor)
            {
                case SIECURSOR.SIECURSORNormal:
                    intPtr = SIECURSORNormalMouseCursor;
                    break;

  case SIECURSOR.SIECURSORLeftBottom2RightTopArrow:
                    intPtr = SIECURSORLeftBottom2RightTopArrowMouseCursor;
                    break;  

}

            // Save old Cursor Intptr
            hOldCur = CopyIcon(intPtr);


            SetSystemCursor(hOldCur, OCR_NORMAL);

}


在这里需要注意一下,必须保存hOldCur

      const int OCR_NORMAL = 32512;       //必须
        private static IntPtr hOldCur;

到这里 只需要通过不同的方法调传不同的enum 就可以。



当程序退出的时候 需要

    if (IssetCursorNormal)
            /// setSystemNormalCursor
                SystemParametersInfo(SPI_SETCURSORS, 0, IntPtr.Zero, SPIF_SENDWININICHANGE);

去把系统cursor 恢复成最原始的状态,代码经过测试无任何文图,希望对大家有帮助。 


相关文章推荐

JAVA调用Google Custom Search API

前文提示:因为google被墙的原因,访问之前需要设置代理服务器,目前国内比较流行的就是免费的goAgent代理,虽然只有1G的流量,是可以满足单纯的网页访问的。在程序中调用API的时候,也是用的go...
  • fumier
  • fumier
  • 2015年03月05日 10:43
  • 1389

Android的Cursor的close方法不调用会不会造成内存泄露

研究内存问题时,突然想到Android的Cursor的Close如果不调用会不会造成内存泄露。 于是翻开Android源码一番跟踪,发现google已经为开发者加了一层保证,即时不调用Close方法,...

C#调用windows API的一些方法

C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数。 2.  调用 COM 对象上的接口方法 我主要讨论从d...

c#调用百度地图web服务api-----该方法可用在js跨域请求上

百度地图Web服务API为开发者提供http接口,即开发者通过http形式发起检索请求,获取返回json或xml格式的检索数据。用户可以基于此开发JavaScript、C#、C++、Java等语言的地...

关于在c#里面调用win api的方法.(我看过得最详细的帖子)

在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的。本文将C#中调用API的要点汇集如下,希...
  • biyusr
  • biyusr
  • 2012年01月31日 08:36
  • 1019

Mybatis 调用多游标参数存储过程 Mybatis Oracle Procedure multi cursor

网上关于Mybatis调用多游标参数存储过程的例子很省

C#中调用Outlook API 发起会议

C#中调用Outlook API 发起会议    要发起会议之类的特殊邮件的话,可以使用Outlook 自身的API。   创建项目后,为它添加.NET引用:“Microsof...

图解C# 调用Win32 API 示例程序

先上代码;相关函数不解释;网上比较容易查到; using System; using System.Collections.Generic; using System.ComponentModel; ...

C#调用百度地图API入门&解决BMap未定义问题

本文主要是最近帮助好友研究JavaScript的百度地图API,同时显示到C# Winform界面。同时遇到了BMap未定义的错误(BMap is not defined)及解决方法。以前写过基于An...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于c# 调用调用api改变custom cursor的方法。
举报原因:
原因补充:

(最多只允许输入30个字)