【问题标题】:How to intercept keyboard input at the lowest level in linux?如何在linux中拦截最低级别的键盘输入?
【发布时间】:2015-09-07 02:23:14
【问题描述】:

我有兴趣为 linux 编写一个程序,该程序将读取所有击键,处理它,然后输出到其余正在运行的进程。本质上,所有的键盘输入都必须进入这个程序并且这个程序单独......然后程序将充当计算机其余部分的键盘。我基本上想在 android 设备上做一些类似预测文本的事情,所以我的程序将充当过滤器。

我要问的基本上是如何将所有键盘事件定向到我的程序。虽然我不是在寻找代码,但我想知道我必须学习 linux 编程/linux 系统的哪个部分才能完成这项任务?这是因为我这样做是为了更好地学习 linux。

【问题讨论】:

  • 1.获取 Linux 内核源代码。 2.修改键盘驱动做你想做的。
  • 那是否意味着我要修改linux内核,然后重新安装?好的,没问题...但是有什么办法可以在用户空间中做到这一点,这样程序就可以与用户共享并轻松安装?
  • Lowest level != userspace。 ...打包的内核并不难安装。
  • 您可以查看已经在某种程度上执行此操作的软件,例如:en.wikipedia.org/wiki/Smart_Common_Input_Method - 当 SCIM 启用时,所有键盘输入都会被它截获,以在西方布局键盘上提供中文字符输入等内容.我认为它使用 iBus。
  • 听起来你正在尝试制作一个透明的键盘记录器。老实说,内核模块是你最好的选择。但请注意,在最低级别,这些不是读取的 ASCII 码,它们是扫描码。

标签: c++ c linux keyboard


【解决方案1】:

您不应该修改键盘驱动程序,因为这将要求您为每个键盘制造商提供解决方案。(而且有很多这样的......)

相反,您应该在将输入进一步向上传递堆栈之前修补一个由所有驱动程序调用的内核函数。

首先,您可以修补input_event,它通常被所有输入驱动程序see documentation here (不仅包括键盘,还包括鼠标和其他设备)调用

在任何情况下,您都必须“解码”输入扫描代码,您可能会发现 this 文档很有用。

有关内核修补的更多信息,请阅读herehere

【讨论】:

  • 您对如何将其实现为内核模块有任何想法吗?我知道在 PS/2 键盘上使用 IRQ 并不难。只是在某处截取击键并可能修改它们的行为。
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 2016-12-23
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2011-04-08
相关资源
最近更新 更多