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

