You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以托管方式获取Windows拖拽复制光标?

获取Windows系统原生拖拽复制光标(Drag Copy Cursor)

我之前在WinForms开发里也碰到过这个问题——自带的Cursors类确实没把拖拽复制光标做成现成的属性,不过咱们可以通过调用Windows原生API来获取,完全不用自己加载位图资源,还能自动适配用户的系统光标设置(比如尺寸、配色),完美符合你的需求。

具体实现步骤:

  1. 引入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);
    
  2. 封装获取光标的方法
    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;
    }
    
  3. 在代码中使用
    现在你就可以像用普通光标一样调用这个方法了:

    ' VB.NET 写法
    Me.Cursor = GetDragCopyCursor()
    
    // C# 写法
    this.Cursor = GetDragCopyCursor();
    

为什么这个方案可行?

WinForms的Cursors类只封装了一部分高频使用的系统光标,像拖拽复制这种更场景化的光标并没有被包含进去。而通过LoadCursor直接调用系统资源,得到的是用户当前系统正在使用的光标实例——不管用户有没有修改过光标大小、换过配色方案,这个光标都会自动匹配系统设置,完全不需要我们自己处理资源文件。

内容的提问来源于stack exchange,提问作者tmighty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:34:59