如何在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
相关产品推荐
相关产品推荐

