确定Linux键盘事件设备

2024-01-07

这另一个问题,从 Linux 输入设备访问按键 https://stackoverflow.com/questions/20943322/accessing-keys-from-linux-input-device

提供了有关如何在没有按下其他键时在 Linux 文本控制台中识别修饰键按下的工作 C 代码。

然而,要应用这个技巧,你必须知道特定的文件/dev/input/event*记录键盘事件。

如何确定该文件的名称?


我更喜欢下一个解决方案,因为它在内部解析设备文件。
如果我们检查 /proc/bus/input/devices 的内容,我们可以发现如下内容:

# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0002 Product=0001 Version=0100
N: Name="vmouse"
P: Phys=vmouse/input0
S: Sysfs=/devices/virtual/input/input0
U: Uniq=
H: Handlers=mouse0 event0
B: PROP=0
B: EV=7
B: KEY=70400 0 0 0 0 0 0 0 0
B: REL=143

I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi-ths"
P: Phys=sunxiths/input0
S: Sysfs=/devices/virtual/input/input3
U: Uniq=
H: Handlers=event3
B: PROP=0
B: EV=9
B: ABS=100 0

I: Bus=0003 Vendor=1220 Product=0008 Version=0100
N: Name="HID 1220:0008"
P: Phys=usb-sunxi-ohci-1/input0
S: Sysfs=/devices/platform/sunxi-ohci.3/usb7/7-1/7-1:1.0/input/input6
U: Uniq=
H: Handlers=sysrq kbd event1
B: PROP=0
B: EV=120013
B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=1f

I: Bus=0003 Vendor=1220 Product=0008 Version=0100
N: Name="HID 1220:0008"
P: Phys=usb-sunxi-ohci-1/input1
S: Sysfs=/devices/platform/sunxi-ohci.3/usb7/7-1/7-1:1.1/input/input7
U: Uniq=
H: Handlers=kbd mouse1 event2
B: PROP=0
B: EV=1f
B: KEY=4837fff 72ff32d bf544446 0 0 1f0001 20f90 8b17c000 677bfa d941dfed 9ed680 4400 0 10000002
B: REL=143
B: ABS=1 0
B: MSC=10

因此,我们唯一需要的就是在出现“EV=120013”字符串的块中找到事件设备号:

#include <fcntl.h>
#include <stdio.h>
#include <string>
#include <string.h>
#include <unistd.h>

using namespace std;

string getInputDeviceName() {
    int rd;
    std::string devName;
    const char* pdevsName = "/proc/bus/input/devices";

    int devsFile = open(pdevsName, O_RDONLY);
    if (devsFile == -1) {
        printf("[ERR] Open input devices file: '%s' is FAILED\n", pdevsName);
    }
    else {
        char devs[2048];

        if ((rd = read(devsFile, devs, sizeof(devs) - 1)) < 6) {
            printf("[ERR] Wrong size was read from devs file\n");
        }
        else {
            devs[rd] = 0;

            char *pHandlers, *pEV = devs;
            do {
                pHandlers = strstr(pEV, "Handlers=");
                pEV = strstr(pHandlers, "EV=");
            }
            while (pHandlers && pEV && 0 != strncmp(pEV + 3, "120013", 6));

            if (pHandlers && pEV) {
                char* pevent = strstr(pHandlers, "event");
                if (pevent) {
                    devName = string("/dev/input/event");
                    devName.push_back(pevent[5]);
                }
                else {
                    printf("[ERR] Abnormal keyboard event device\n");
                }
            }
            else {
                printf("[ERR] Keyboard event device not found\n");
            }
        }
    }

    return devName;
}

NOTE1:此代码适用于编号小于 10 的事件设备。
NOTE2:请检查“devs”缓冲区大小,在您的系统上 2048 字节可能不够。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定Linux键盘事件设备 的相关文章

随机推荐

  • PInvoke - 从指针编组结构数组

    我正在尝试遵循以下答案这个问题 https stackoverflow com a 2403083 27494 我的结构在 C 中看起来像这样 typedef struct drive info t unsigned char drive
  • 将 Apache Cordova/PhoneGap 与 Android 2.x 结合使用

    似乎不可能为 Android 2 x 创建 PhoneGap 应用程序 是对的吗 要使用phonegap运行Android应用程序 请将您的应用程序构建为Android 4 0 3 并将最低版本设置为您想要的较低版本 基本上 Android
  • cPanel cron 作业,未指定输入文件?

    我刚刚设置了我的第一个 cron jon 来每晚运行一个股票脚本 手动运行它效果很好 它存储在 admin stock update php中 我正在运行的命令是 usr bin php q admin stock update php 但
  • 如何对类的单个枚举进行 Javadoc

    我正在为一个包含自己的枚举的类编写 Javadoc 有没有办法为各个枚举生成 Javadoc 例如 现在我有这样的事情 This documents HairColor private static enum HairColor BLACK
  • 从方法返回泛型类型的实例

    我想要一个方法getInstance它接受一个字符串值并返回一个对象实例 在方法签名中定义为泛型 def getInstance T dataStr String Option T T match case typeOf String gt
  • Avro 模式中的多态性和继承

    是否可以编写一个 Avro 模式 IDL 来生成一个扩展基类或实现接口的 Java 类 生成的 Java 类似乎扩展了org apache avro specific SpecificRecordBase 因此 工具可能是一条出路 但是 我
  • 由矩形组成的形状最少有多少个矩形?

    我不确定是否有算法可以解决这个问题 将给定数量的矩形从左到右水平并排放置以形成一个形状 您将获得每个的宽度和高度 您如何确定覆盖整个形状所需的最小矩形数量 即 您将如何使用尽可能少的矩形重新绘制该形状 我只能考虑尝试挤压尽可能多的大矩形 但
  • 有没有办法区分 iPhone 3G/S 访问者和 iPhone 4 访问者?

    我想为 iPhone 4 用户加载更高分辨率的图片 但我知道检测用户的唯一方法是通过用户代理 但我的印象是任何 iOS4 手机上的 MobileSafari 用户代理都是一样的 我该怎么做才能检测到 iPhone 4 您可以使用 CSS3
  • 如何使用 java 和 xmlunit 比较具有相同命名空间但不同前缀的两个 xml

    我有 2 个 xml 文件 问题出在属性前缀中
  • 水平 ListView Xamarin.Forms

    有什么办法可以创建ListView with horizontal scroll in Xamarin Forms喜欢图像 这就是我为垂直所做的 var myListView new ListView ItemTemplate new Da
  • 在同一端口上运行两个 Web 应用程序?

    我们有两个不同的 Java Web 应用程序 名为 foo war 和 bar war 我们希望将它们部署在 Jetty 服务器上 Jetty 正在机器上的 8080 端口上运行 是否可以在同一端口上同时运行两个应用程序 如果没有 在同一码
  • 单击通知即可转到当前活动

    我正在使用这个解决方案 如何使通知意图恢复而不是制定新意图 https stackoverflow com questions 3305088 how to make notification intent resume rather th
  • JMS消息大小

    我目前正在研究使用 JMS 即 Spring 框架 JMS 和 Active MQ 在服务器和客户端之间发送有效负载消息的应用程序的带宽限制功能 不要问我为什么 这不是我的决定 我发现了很多限制传入 JMS 消息的方法 但没有一个基于实际带
  • 合并两个具有相同列名的数据框

    我有两个具有这种格式的 data frame 这是数据集的一小部分 数据框1 ID precip lat lon 1 45 115 122 5 2 42 5 130 122 5 3 40 155 122 5 4 37 5 140 122 5
  • 使用 system() 在 C 中执行 sudo 命令

    我正在编写一段 C 代码 它将运行一些sudo命令输入system sudo ip route 函数调用 此调用是在主线程创建的 pthread 中完成的 并且主程序正在执行sudo program启动时 当我运行该程序时 Ubuntu 提
  • Firefox 上的

    当我在按钮元素内的 span 元素的单击事件上绑定操作时 我遇到了 Firefox 32 的问题 其他浏览器似乎运行良好 这里的jsFiddle 上说明问题的代码 http jsfiddle net tqf0z7x5 span Workin
  • 在具有多个模块(如 JHipster)的项目中嵌套角度组件

    我试图在另一个实体组件中显示一个实体组件 我在网上找到了一些关于共享模块的信息 我也检查了这个post https stackoverflow com questions 42284351 jhipster 4 how to put ent
  • 使用服务器变量配置 URL 重写以支持多个源

    几天前我正在处理 CORS 问题 我需要支持多个来源 我做了一些研究 发现有几篇文章向我介绍了这个很棒的工具 URL 重写 我按照 Paco Zarate 提示得到了我想要的解决方案 具有多个域的访问控制允许来源 https stackov
  • $new = new self($data);带有私有函数甚至变量oO?

    我的 php 5 3 有一个奇怪的行为 我有一个类在函数中执行此操作 new new self data new gt setServiceManager this gt service new gt cacheInstance 但是函数c
  • 确定Linux键盘事件设备

    这另一个问题 从 Linux 输入设备访问按键 https stackoverflow com questions 20943322 accessing keys from linux input device 提供了有关如何在没有按下其他