- 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/
我正在努力解决一个问题 Rahul 正在玩一个非常有趣的游戏。他有 N 个圆盘(每个圆盘的半径相等)。每个磁盘都有一个不同的数字,从 1 到 N 与之相关联。磁盘一个接一个地放在一堆中。 Rahul
我正在尝试使用此代码发出请求: public JsonObject account() throws BinanceApiException { return (new Request
我使用的是 Mac OS 和 emacs -nw (终端模式)。 我不知道如何在 emacs 之外粘贴东西(已由 M-w 在 emacs -nw 中实现)。 我知道emacs -ns可以做到。 搜索互
我试图让导航栏菜单出现在“标题容器”菜单中,但由于某种原因,导航栏链接流到外面(在修改浏览器窗口之前)。我不明白为什么,但我怀疑它与这一行有关: div class="collapse navbar-
我们的项目是在 WAS 6.1/hibernate/struts 上使用 RAD 7.0 开发的中型 Web 应用程序,该应用程序已投入生产。目前我们在属性文件中硬编码了生产系统的 IP 地址,在 h
我的要求是在传单中创建 N 类型的标记。该列表很大,无法容纳在 map 区域中。 我想要类似的东西: http://blog.georepublic.info/2012/leaflet-example
如 docs 中所述,基于 spring-boot 的 Web 服务正在使用 Sentry .它工作正常,但不应将某些异常发送到 Sentry ,例如为了在某些请求上返回 HTTP 状态 410
我已经阅读了 Apple Core Animation 文档。它说核心动画没有提供在窗口中实际显示图层的方法,它们必须由 View 托管。当与 View 配对时, View 必须为底层图层提供事件处理
我试图在滚动时检查元素是否在我的视口(viewport)内。如果它在我的视口(viewport)之外,我会添加一个类来将元素固定到顶部。 我用来确定元素是否在视口(viewport)之外的函数是: i
我正在查询中创建一个弹出窗口。悬停时弹出窗口一切正常。当用户的鼠标离开 div 以关闭它时,我让它看到计时器启动。如果他在计时器完成之前再次进入 div,则计时器将被清除。 这很好,但是如果用户点击
我使用名为 zonemap 的字典创建了一个 4x6 区域 map 。我在该字典中嵌套了多个字典;每个区域代表玩家可以访问并与之互动的区域。我希望能够将玩家的移动限制在该 4x6 区域,并重新显示他们
我正在构建一个页面,该页面将使用 ajax 来更新主要内容区域。用户将单击左侧菜单栏中的项目来更新右侧的 div 并包含搜索结果。 我想检测用户是否向下滚动到目前为止导致右侧结果 div 移出视口(v
好的,我在 div 中有一个带有拖放类的表格,其溢出设置为“自动”,这允许我隐藏部分时间表,只在底部放置一个滚动条。但是,我只是在可滚动 div 之外创建了一些可放置元素,并且我的可拖动元素无法离开可
我有大量项目绑定(bind)到 ListBox,VirtualizingStackPanel 设置为它的 ItemsPanel。随着用户滚动和项目容器的创建,我做了一些工作来用数据填充项目(使用数据库
我想知道是否有一种方法可以将类成员的访问范围专门限定为在 C# 中获取/设置实现,以减少我意外直接访问它们的可能性。类似 private 的东西,但只允许 get/set 访问它,我想我可以将每个变量
我正在尝试编写一个小游戏,以应用我自己在本类(class)中学到的概念。当游戏打开时,我想要一个自定义模态视图来告诉用户如何玩。同样,当他们输了时,我想呈现一个结果页面,该页面将位于 if 语句内。我
我有一个非常具体的 HTML/CSS 和/或 JS 问题。我在 this fiddle here 创建了一个示例显示问题。 我有一个可滚动的 div,它是一个表的父级: ...我的表格行之一包
我的 jar 文件中打包了一个 exe,我试图将它复制到一个临时位置,以便我可以使用 Desktop.browse() 运行它,为此我设置了一个使用 class.getResourceAsStream
您好,我对这段代码有疑问。我的问题是第一个 console.log(smile_per_sec) 给了我需要的值,但是第二个给了我声明变量时给它的值。 $.getJSON( twitter
我必须更改标记弹出窗口的默认大小以容纳我想放入其中的数据。我更改了一些 map 设置,因此当用户将其拖出 View 时,它总是会弹回最大范围。我遇到的问题是,对于靠近边缘的标记,当它的弹出窗口打开时,
我是一名优秀的程序员,十分优秀!