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

如何在X11 C++应用中获取Num Lock与Scroll Lock状态

在X11 C++应用中获取Num Lock和Scroll Lock状态

你可以用同样的XkbGetIndicatorState函数来获取Num Lock和Scroll Lock的状态,这个函数返回一个位掩码,每个指示灯对应其中的一个二进制位。关键是要确定这两个锁对应的指示器索引,推荐通过名称查询的方式获取,避免依赖固定位序(不同环境可能有差异)。

实现步骤与代码示例

  1. 打开X服务器连接:
#include <X11/Xlib.h>
#include <X11/XKBlib.h>
#include <iostream>

int main() {
    Display* dpy = XOpenDisplay(nullptr);
    if (!dpy) {
        std::cerr << "无法打开X显示" << std::endl;
        return 1;
    }
  1. 获取当前指示器状态掩码:
unsigned int indicator_state = XkbGetIndicatorState(dpy, XkbUseCoreKbd);
  1. 查询Num Lock对应的索引并判断状态:
int num_lock_idx;
    // 查询Num Lock指示器的索引
    if (XkbGetNamedIndicator(dpy, XkbUseCoreKbd, "Num Lock", &num_lock_idx, nullptr, nullptr, nullptr)) {
        bool num_lock_active = (indicator_state & (1 << num_lock_idx)) != 0;
        std::cout << "Num Lock状态:" << (num_lock_active ? "开启" : "关闭") << std::endl;
    } else {
        std::cerr << "无法获取Num Lock指示器信息" << std::endl;
    }
  1. 同理获取Scroll Lock的状态:
int scroll_lock_idx;
    // 查询Scroll Lock指示器的索引
    if (XkbGetNamedIndicator(dpy, XkbUseCoreKbd, "Scroll Lock", &scroll_lock_idx, nullptr, nullptr, nullptr)) {
        bool scroll_lock_active = (indicator_state & (1 << scroll_lock_idx)) != 0;
        std::cout << "Scroll Lock状态:" << (scroll_lock_active ? "开启" : "关闭") << std::endl;
    } else {
        std::cerr << "无法获取Scroll Lock指示器信息" << std::endl;
    }

    XCloseDisplay(dpy);
    return 0;
}

编译注意事项

编译时需要链接X11库,例如:

g++ your_app.cpp -o your_app -lX11

说明

  • XkbUseCoreKbd表示使用核心键盘设备,适合大多数场景。
  • 用名称查询索引的方式比直接依赖固定位(比如默认Num Lock是位1、Scroll Lock是位2)更可靠,某些自定义键盘布局可能会调整指示器顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:57:11