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

如何检测文本光标是否显示及通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:22:37