如何以托管方式获取Windows拖拽复制光标?
获取Windows系统原生拖拽复制光标(Drag Copy Cursor)
我之前在WinForms开发里也碰到过这个问题——自带的Cursors类确实没把拖拽复制光标做成现成的属性,不过咱们可以通过调用Windows原生API来获取,完全不用自己加载位图资源,还能自动适配用户的系统光标设置(比如尺寸、配色),完美符合你的需求。
具体实现步骤:
引入Win32 API声明
首先需要在代码里声明LoadCursor函数,它负责从系统中加载预定义的光标。记得要引用System.Runtime.InteropServices命名空间:using System.Runtime.InteropServices; [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr LoadCursor(IntPtr hInstance, int lpCursorName);封装获取光标的方法
Windows系统预定义的拖拽复制光标常量是IDC_DRAGCOPY,对应的数值是32646。我们可以写一个简单的方法来获取这个光标:public static Cursor GetDragCopyCursor() { const int IDC_DRAGCOPY = 32646; // 传入IntPtr.Zero表示加载系统预定义光标 IntPtr cursorHandle = LoadCursor(IntPtr.Zero, IDC_DRAGCOPY); if (cursorHandle != IntPtr.Zero) { return new Cursor(cursorHandle); } // 兜底方案:如果获取失败,返回你原本用的Cross光标 return Cursors.Cross; }在代码中使用
现在你就可以像用普通光标一样调用这个方法了:' VB.NET 写法 Me.Cursor = GetDragCopyCursor()// C# 写法 this.Cursor = GetDragCopyCursor();
为什么这个方案可行?
WinForms的Cursors类只封装了一部分高频使用的系统光标,像拖拽复制这种更场景化的光标并没有被包含进去。而通过LoadCursor直接调用系统资源,得到的是用户当前系统正在使用的光标实例——不管用户有没有修改过光标大小、换过配色方案,这个光标都会自动匹配系统设置,完全不需要我们自己处理资源文件。
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

