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

Ubuntu环境下如何用C++获取当前活动键盘的名称?

在Ubuntu下用C++获取当前键盘名称

方法1:使用libudev库(推荐)

libudev是Linux系统设备管理的官方库,能可靠枚举输入设备并获取属性。以下是完整C++实现:

#include <iostream>
#include <libudev.h>
#include <string>

int main() {
    // 初始化udev上下文
    struct udev *udev = udev_new();
    if (!udev) {
        std::cerr << "无法初始化udev上下文" << std::endl;
        return 1;
    }

    // 创建输入设备枚举器
    struct udev_enumerate *enumerate = udev_enumerate_new(udev);
    udev_enumerate_add_match_subsystem(enumerate, "input");
    udev_enumerate_scan_devices(enumerate);

    // 遍历设备列表
    struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);
    struct udev_list_entry *entry;

    udev_list_entry_foreach(entry, devices) {
        const char *sys_path = udev_list_entry_get_name(entry);
        struct udev_device *dev = udev_device_new_from_syspath(udev, sys_path);

        // 判断是否为键盘设备
        const char *is_kbd = udev_device_get_property_value(dev, "ID_INPUT_KEYBOARD");
        if (is_kbd && std::string(is_kbd) == "1") {
            // 获取键盘名称
            const char *kbd_name = udev_device_get_property_value(dev, "NAME");
            if (kbd_name) {
                std::cout << "键盘名称: " << kbd_name << std::endl;
                // 若只需第一个键盘,取消下面注释
                // break;
            }
        }

        udev_device_unref(dev);
    }

    // 释放资源
    udev_enumerate_unref(enumerate);
    udev_unref(udev);

    return 0;
}

编译与运行

编译时需链接libudev库:

g++ -o keyboard_info keyboard_info.cpp -ludev

执行生成的二进制文件即可输出所有键盘设备名称。


方法2:解析/proc/bus/input/devices文件

若不想依赖外部库,可直接读取/proc/bus/input/devices文件并解析键盘信息:

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::ifstream dev_file("/proc/bus/input/devices");
    if (!dev_file.is_open()) {
        std::cerr << "无法打开设备信息文件" << std::endl;
        return 1;
    }

    std::string line;
    bool is_keyboard = false;

    while (std::getline(dev_file, line)) {
        // 检测设备类型是否为键盘
        if (line.starts_with("I: ")) {
            is_keyboard = (line.find("kbd") != std::string::npos);
        }
        // 提取键盘名称
        if (is_keyboard && line.starts_with("N: ")) {
            std::string kbd_name = line.substr(4);
            std::cout << "键盘名称: " << kbd_name << std::endl;
            // 若只需第一个键盘,取消下面注释
            // break;
            is_keyboard = false;
        }
    }

    dev_file.close();
    return 0;
}

编译与运行

直接编译,无需额外依赖:

g++ -o keyboard_name keyboard_name.cpp

注意事项

  • 方法1的libudev方式兼容性更好,能精准识别设备类型,适合生产环境。
  • 方法2依赖/proc文件系统格式,虽在Ubuntu下稳定,但内核版本更新可能导致格式变化。
  • 若系统存在多个键盘,两种方法都会输出所有匹配设备,按需添加break语句可只获取第一个键盘。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:49:59