- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试编写一个需要从类键盘 (HID) 设备获取输入的 Linux 守护程序 - 它不是控制台键盘,而是第二个设备(如果有任何区别,它实际上是一维条形码扫描仪) .守护进程将处理它接收到的数据(来自字母数字条形码的“击键”)。
我知道守护进程可以使用 ioctl(EVIOCGRAB) 从/dev/input/eventx 中获取该设备,然后读取 () 事件(struct input_event from
使用输入事件需要编写一大堆额外的代码,只是为了从中得到“A”——这似乎是在浪费时间和精力,因为几乎肯定有现有的键盘处理程序(或类似的东西) ) 这比我一起破解代码要好得多 - 我就是找不到它们!
有没有什么方法可以将现有的(键盘?)软件层放到/dev/input/eventx 上,然后守护进程可以从中专门读取简单的 ascii 流?
对于这个设备,/proc/bus/input/devices 报告 ...
H: Handlers=sysrq kbd leds event9
...这可能表明某些东西已经在其上放置了一个“kbd”层,但是如何访问它呢?
如果我不使用 EVIOCGRAB,那么当我扫描条形码时,我会看到关于“在/dev/tty1 上登录失败”的系统日志,因此键盘输入显然是在尝试登录到某处的终端/shell :-/(有这台机器上也没有 X、桌面等。)
最佳答案
我不知道有这样的库或守护进程。
然而,编写一个守护进程来执行此操作并不像您想象的那么难。以我的观点/经验,如果您不需要实现自动重复(也就是说,只有在类似键盘的设备发送自动重复按键时才执行自动重复),守护进程非常简单。
特别是,主循环只是一个阻塞读取,然后是零个或多个阻塞写入,中间是一个数组查找。
您可以使用命名管道(在这种情况下,您在打开设备之前打开管道,因为只有在另一个进程打开命名管道或 FIFO 进行读取后,打开才会成功),或者套接字; Unix 域套接字,或者 TCP 或 UDP 套接字(在环回接口(interface)上)。我可能会使用命名管道,/var/run/barcode-scanner
。
我会为输入映射使用单独的配置文件,并且我会支持来自 /usr/include/linux/input-event-codes 的预处理器宏名称 (
,使用辅助 awk 脚本解析为数组。键映射文件可能位于 KEY_
) .h/etc/barcode-scanner/keymap
中,并包含类似于
KEY_1 = 1
KEY_NUMERIC_1 = 1
KEY_E = e
shift KEY_E = E
ctrl KEY_E = \5
altgr KEY_E = €
KEY_UP = \033[A
等等。定义文件中未列出的事件将被忽略或可选择记录。
可以使用数组,因为最多有768个(0到KEY_MAX,含;虽然0是KEY_RESERVED)个不同的键盘事件;作为二维数组,您可能需要 16 个数组,以支持 Shift、Ctrl、Alt 和AltGr(或右 alt 键),当按下每个键时。在内部,您只需要处理 KEY_LEFTSHIFT
、KEY_RIGHTSHIFT
、KEY_CAPSLOCK
(以管理换档状态); KEY_LEFTALT
(管理 alt 状态); KEY_RIGHTALT
(管理 altgr 状态);以及 KEY_LEFTCTRL
和 KEY_RIGHTCTRL
(用于管理 ctrl 状态)。如果使用位掩码来指示当前状态,则可以将其用作查找数组外部维度的索引。这真的非常简单。
请注意,每个数组元素都是一个字符串,当按下该状态的键时会发出该字符串(ev.value == 1
对于按键,ev.value == 2
用于自动重复)。除了上述特殊键,您根本不需要处理键释放。
嗯。我想知道是否还有其他人需要这样的守护进程?如果源代码位于 GitHub,您会使用 GPL3 许可的吗?
关于c - 除了/dev/input/eventx 之外,是否有更高级别(字符?)的方式来访问 Linux 键盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50309081/
我正在通过创建虚拟键盘/鼠标来玩 uinput。我设置虚拟设备没问题。 int fd; struct uinput_user_dev uidev; struct
我想从/dev/input/eventX-Files 读取输入数据(键盘输入)。我想,我在以下位置找到了信息: lrwxrwxrwx 1 root root 9 19. Feb 07:45 usb-_
我正在尝试从/dev/input/event2 读取原始键盘缓冲区 ls -l /dev/input/by-id/ lrwxrwxrwx 1 root root 9 Mar 14 21:08 usb-
这些文件是否代表设备中的所有传感器?我在我的 android 设备上有 rot 访问权限,但是当我尝试打开这些文件时,我发现它们是空的,我的文件管理器浏览器告诉我这些文件在我浏览此目录前几秒钟已被修改
我有一个程序正在监听某个事件文件句柄。是否有我可以阅读的文件以获取有关我正在收听的特定事件的设备的详细信息? 最佳答案 假设 (a) 您在 Linux 上并且 (b) 您安装了 sysfs(通常在 /
我正在开发一个需要将触摸事件发送到/dev/input/eventX 的 android 应用程序。我知道执行此类操作的 C 代码结构如下: struct input_event { stru
我正在从事一个项目,该项目要求我在 Scientific Linux 6.4(Linux 内核 2.6.32)上运行触摸屏。虽然内核不完全支持触摸屏,但当我触摸屏幕时,我能够看到在触摸屏的 /dev/
我有一个自制的键盘,我想用 bash 脚本读出。键盘位置是/dev/input/event1 我正在尝试通过 在 bash 中读取此输入 read input
我需要检测某种类型的设备(例如鼠标)并使用守护进程在 Linux 中捕获它的事件。 Xlib 的使用似乎没有用,因为Xlib 只能捕获应用程序创建的窗口事件,而不是所有系统事件(但如果我错了,请纠正我
我正在开发一些需要在程序中向手机注入(inject)触摸屏事件的程序,我正在使用开源库 https://code.google.com/p/android-event-injector/通过在 dev
我正在尝试编写一个需要从类键盘 (HID) 设备获取输入的 Linux 守护程序 - 它不是控制台键盘,而是第二个设备(如果有任何区别,它实际上是一维条形码扫描仪) .守护进程将处理它接收到的数据(来
我正在 try catch linux 键盘/鼠标输入,并且正在读取来自 /dev/input/event2 之类的事件。但似乎输入有时会定向到 /dev/input/event2,有时会定向到 /d
所以我的守护进程会坐在那里听 udev,等待连接/断开事件,这样它就可以通知其他线程连接或停止读取/dev/input/eventX 文件。 本质上,它正在监听连接到本地系统(模拟 HID 键盘)的
我是一名优秀的程序员,十分优秀!