如何检测文本光标是否显示及通过Windows API检查特定HANDLE中的光标
文本光标检测实现方案
1. 检测系统当前是否显示文本光标
要判断系统当前是否显示文本光标,可通过GetCursorInfo获取全局光标信息,结合标准文本光标标识判断:
- 调用
GetCursorInfo获取CURSORINFO结构体,包含当前光标句柄与状态 - 比对光标句柄是否为系统默认文本光标(
IDC_IBEAM),以此判断是否显示文本光标
2. 通过Windows API检查特定窗口句柄中是否存在文本光标
针对指定窗口,需结合线程GUI信息与控件焦点状态判断:
- 使用
GetGUIThreadInfo获取目标窗口所属线程的GUI状态,包含焦点控件、光标显示状态 - 验证焦点控件是否为目标窗口的子控件,同时确认光标处于显示状态
完整代码示例
#include <windows.h> #include <stdio.h> // 判断当前系统是否显示文本光标 BOOL IsTextCursorVisible() { CURSORINFO cursorInfo = { sizeof(CURSORINFO) }; if (!GetCursorInfo(&cursorInfo)) { return FALSE; } // 匹配系统默认文本光标(竖线样式) return cursorInfo.hCursor == LoadCursor(NULL, IDC_IBEAM); } // 检查指定窗口内是否存在文本光标 BOOL IsTextCursorInTargetWindow(HWND targetWnd) { if (!targetWnd || !IsWindow(targetWnd)) { return FALSE; } GUITHREADINFO guiThreadInfo = { sizeof(GUITHREADINFO) }; DWORD threadId = GetWindowThreadProcessId(targetWnd, NULL); if (!GetGUIThreadInfo(threadId, &guiThreadInfo)) { return FALSE; } // 验证焦点控件属于目标窗口,且光标处于显示状态 return (guiThreadInfo.hwndFocus != NULL && IsChild(targetWnd, guiThreadInfo.hwndFocus)) && (guiThreadInfo.flags & GUI_CURSORSHOWN); } int main() { // 示例1:检测全局文本光标状态 if (IsTextCursorVisible()) { printf("当前系统显示文本光标\n"); } else { printf("当前系统未显示文本光标\n"); } // 示例2:检查前台窗口内的文本光标 HWND foregroundWnd = GetForegroundWindow(); if (IsTextCursorInTargetWindow(foregroundWnd)) { printf("前台窗口中存在文本光标\n"); } else { printf("前台窗口中不存在文本光标\n"); } return 0; }
补充说明
- 若需支持自定义文本光标,可通过
GetIconInfo获取光标像素数据,进一步比对形状特征 GUITHREADINFO能精准定位光标所属的窗口与控件,适合对特定窗口做针对性检测
内容的提问来源于stack exchange,提问作者Handsome guy
相关产品推荐
相关产品推荐

