如何将.NET自定义系统光标变为光标?

摘要:本文介绍如何操作windows系统光标。正常我们设置隐藏光标,只能改变当前窗体或者控件范围,无法全局操作windows光标。接到一个需求,想隐藏windows全局的鼠标光标显示,下面讲下如何操作 先了解下系统鼠标光标,在鼠标属性-自定义列
本文介绍如何操作windows系统光标。正常我们设置/隐藏光标,只能改变当前窗体或者控件范围,无法全局操作windows光标。接到一个需求,想隐藏windows全局的鼠标光标显示,下面讲下如何操作 先了解下系统鼠标光标,在鼠标属性-自定义列表中可以看到一共有13种类型,对应13种工作状态: 操作系统提供了一组预定义的光标,如箭头、手形、沙漏等,位于 C:\Windows\Cursors目录下。 对应的Windows.Input.CursorType枚举: 1 public enum CursorType 2 { 3 None, 4 No, 5 Arrow, 6 AppStarting, 7 Cross, 8 Help, 9 IBeam, 10 SizeAll, 11 SizeNESW, 12 SizeNS, 13 SizeNWSE, 14 SizeWE, 15 UpArrow, 16 Wait, 17 Hand, 18 Pen, 19 ScrollNS, 20 ScrollWE, 21 ScrollAll, 22 ScrollN, 23 ScrollS, 24 ScrollW, 25 ScrollE, 26 ScrollNW, 27 ScrollNE, 28 ScrollSW, 29 ScrollSE, 30 ArrowCD, 31 } 光标显示逻辑: 全局光标设置:在桌面或非控件区域,使用默认系统光标。 窗口控件的设置:每个窗口控件可以设置自己的光标类型。当鼠标移动到该控件上时,将自动切换到该设置的光标。如果未设置则显示系统光标 当鼠标移动、点击或执行其他操作时,系统会检测并相应更新光标形状。应用程序也可以改变拖放等操作的光标 对当前鼠标状态有获取需求的,可以通过GetCursorInfo获取,当前鼠标光标id以及句柄: 1 private IntPtr GetCurrentCursor() 2 { 3 CURSORINFO cursorInfo; 4 cursorInfo.cbSize = Marshal.SizeOf(typeof(CURSORINFO)); 5 GetCursorInfo(out cursorInfo); 6 var cursorId = cursorInfo.hCursor; 7 var cursorHandle = CopyIcon(cursorId); 8 return cursorHandle; 9 } 那如何隐藏系统光标呢?系统光标可以通过SetSystemCursor function (winuser.h) - Win32 apps | Microsoft Learn函数设置,不过貌似没有隐藏光标的入口 可以换个思路,创建一个空白光标即可。我做了一个blank.cur:自己动手制作 windows鼠标光标文件(.cur格式)-CSDN博客 然后隐藏系统光标: 1 private void HideCursor() 2 { 3 _cursorHandle = GetCurrentCursor(); 4 //替换为空白鼠标光标 5 var cursorFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Blank.cur"); 6 IntPtr cursor = LoadCursorFromFile(cursorFile); 7 SetSystemCursor(cursor, OcrNormal); 8 } 恢复系统光标的显示,将之前光标Handle设置回去: 1 var success = SetSystemCursor(_cursorHandle, OcrNormal); 以上是实现了当前光标的替换。但上面有介绍过鼠标光标状态有13种,会根据应用程序状态进行切换,所以其它光标也要处理。
阅读全文