打开输入设备,
#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <linux/input.h>#include <string.h>#include <stdio.h>static const char *const evval[3] = { "RELEASED", "PRESSED ", "REPEATED"};int main(void){ const char *dev = "/dev/input/by-path/platform-i8042-serio-0-event-kbd"; struct input_event ev; ssize_t n; int fd; fd = open(dev, O_RDONLY); if (fd == -1) { fprintf(stderr, "Cannot open %s: %s.n", dev, strerror(errno)); return EXIT_FAILURE; }然后从设备 读取 键盘事件:
while (1) { n = read(fd, &ev, sizeof ev); if (n == (ssize_t)-1) { if (errno == EINTR) continue; else break; } else if (n != sizeof ev) { errno = EIO; break; }如果发生任何错误,或者用户空间仅接收部分事件结构(不应发生,但可能在将来的/笨拙的内核中发生),则以上代码段将从循环中中断。您可能希望使用更强大的读取循环;我个人会被替换最后一个满足
break用
continue,所以,局部的事件结构被忽略。
然后,您可以检查
ev事件结构以查看发生了什么,并完成程序:
if (ev.type == EV_KEY && ev.value >= 0 && ev.value <= 2) printf("%s 0x%04x (%d)n", evval[ev.value], (int)ev.pre, (int)ev.pre); } fflush(stdout); fprintf(stderr, "%s.n", strerror(errno)); return EXIT_FAILURE;}对于按键,
ev.time
:事件的时间(struct timeval
类型)ev.type
:EV_KEY
ev.pre
:KEY_*
,密钥标识符;请参阅中的完整列表/usr/include/linux/input.h
ev.value
:0
如果释放按键1
,2
如果按键,如果自动重复按键
有关更多详细信息,请参见Linux内核资源中的documentation / input /
input.txt。
in
/usr/include/linux/input.h中的命名常量非常稳定,因为它是内核-
用户空间接口,内核开发人员非常努力地维护兼容性。(也就是说,您可以期望偶尔会有新的代码,但是现有代码很少更改。)



