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

如何在C语言中获取鼠标箭头光标的原始HCURSOR?

解决光标隐藏后恢复原始箭头光标的问题
  • 你用GetCursor()的问题出在:这个函数获取的是当前线程正在使用的光标,不是系统默认的箭头光标(对应宏IDC_ARROW),所以用它来恢复系统光标肯定不对。要拿到原始的系统箭头光标,直接调用LoadCursor(NULL, IDC_ARROW)就行,这个函数会加载系统自带的箭头光标资源。

  • 修正你的替换光标代码:
    首先,你代码里的内存分配写错了——malloc(sizeof(hide) * 1)算的是指针的大小,不是COLORREF的大小,应该改成malloc(sizeof(COLORREF) * 1),或者直接用栈变量更省心,还能避免内存泄漏。
    另外,调用SetSystemCursor后,系统会接管光标对象,别直接用DeleteObject释放,自定义光标要用DestroyCursor来销毁。
    修正后的代码示例:

    // 提前加载系统原始箭头光标(可以放在程序初始化时)
    HCURSOR g_OriginalArrowCursor = LoadCursor(NULL, IDC_ARROW);
    
    // 临时替换为透明光标实现隐藏
    COLORREF hide = RGB(0, 0, 0); // 用栈变量,不用malloc
    HBITMAP bmp = CreateBitmap(1, 1, 1, 32, &hide);
    ICONINFO Ico = {0};
    Ico.fIcon = FALSE;
    Ico.hbmColor = bmp;
    Ico.hbmMask = bmp;
    HCURSOR transparentCursor = CreateIconIndirect(&Ico);
    
    // 替换系统箭头光标(32512就是宏OCR_NORMAL,用宏可读性更高)
    SetSystemCursor(transparentCursor, OCR_NORMAL);
    Sleep(10);
    // 恢复原始箭头光标
    SetSystemCursor(g_OriginalArrowCursor, OCR_NORMAL);
    
    // 清理临时资源
    DestroyCursor(transparentCursor);
    DeleteObject(bmp);
    
  • 更简单的临时隐藏方案:如果只是要短时间隐藏光标,没必要替换系统光标,直接用ShowCursor函数更轻量:

    // 隐藏光标(注意:多次调用ShowCursor(FALSE)需要对应次数的ShowCursor(TRUE)才能恢复)
    int cursorVisibleCount = ShowCursor(FALSE);
    Sleep(10);
    // 确保光标恢复到初始可见状态
    while (ShowCursor(TRUE) < cursorVisibleCount);
    

    这个方法不会修改系统光标设置,只是临时改变光标的可见性,更适合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:57:24