Linux下删除/重写/生成键盘事件

2023-12-30

我想在 Linux 下挂钩、拦截和生成键盘(make/break)事件,然后再将它们传递给任何应用程序。更准确地说,我想检测关键事件流中的模式,并能够根据检测到的模式丢弃/插入事件到流中。

我在 SO 上看到了一些相关问题,但是:

  • 它们要么只处理如何获取关键事件(按键记录器等),而不是如何操纵它们的传播(它们只监听,但不拦截/生成)。
  • 或者他们在 X 中使用被动/主动抓取(请阅读下面的更多内容)。

小型 DSL

我在下面解释这个问题,但为了使其更加紧凑和易于理解,首先是一个小的 DSL 定义。

  • A_:用于 make(按)键 A
  • A^:用于中断(释放)键 A
  • A^->[C_,C^,U_,U^]: on A^向 C 发送通断组合,然后向 U 进一步发送处理链(最后发送至应用程序)。如果没有->那么就没有发送任何内容(但内部状态可能会被修改以检测后续事件)。
  • $X:执行任意动作。这可以发送一些可配置的关键事件序列(可能类似于C-x C-s对于 emacs),或执行一个函数。如果我只能发送关键事件,那就足够了,因为我可以根据哪个应用程序处于活动状态在窗口管理器中进一步处理这些事件。

问题描述

好的,通过这种表示法,以下是我想要检测的模式以及我想要沿着处理链传递的事件。

  1. A_, A^->[A_,A^]: 解释。参见上文,请注意发送发生在A^.
  2. A_, B_, A^->[A_,A^], B^->[B_,B^]:与1基本相同,但重叠事件不会改变处理流程。
  3. A_, B_, B^->[$X], A^:如果在按住另一个键(A)时有一个键(B)的完整接通/断开,则执行X(见上文),并且丢弃A的断开。

(原则上它是一个通过按键事件实现的简单状态机,它可以生成(多个)按键事件作为输出)。

补充笔记

  • 该解决方案必须以打字速度运行。
  • 修改后的关键事件流的使用者在 Linux 上的 X 下运行(控制台、浏览器、编辑器等)。
  • 只有键盘事件影响处理(没有鼠标等)
  • 匹配可以发生在键符号(更容易一点)或键码(更难一点)上。对于后者,我只需要读取映射即可从代码转换为键符号。
  • 如果可能的话,我更喜欢一个既可以与 USB 键盘一起使用也可以在虚拟机内部使用的解决方案(如果在驱动程序层工作可能会出现问题,其他层应该没问题)。
  • 我对实现语言持开放态度。

可能的解决方案和问题

所以基本问题是如何实现这一点。

我已经在窗口管理器中使用被动抓取实现了一个解决方案(XGrabKey) and XSendEvent。不幸的是,被动抓取在这种情况下不起作用,因为它们无法正确捕获B^在上面的第二个模式中。原因是转换后的抓取结束于A^并且不会继续B^。如果仍然按住,但仅在大约 1 秒后,新的抓取就会转换为捕获 B。否则就是普通的B^被发送到应用程序。这可以通过以下方式验证xev.

我可以将我的实现转换为使用主动抓取(XGrabKeyboard),但我不确定如果窗口管理器始终有效地抓住键盘,对其他应用程序的影响。 X 文档将主动抓取称为侵入性的并且是为短期使用而设计的。如果有人有这方面的经验,并且长期主动抓取没有重大缺点,那么我会认为这是一个解决方案。

除了窗口管理器(作为 X 客户端运行)之外,我愿意查看关键事件处理的其他层。键盘驱动程序或映射是可能的,只要我能用它们解决上述问题。这也意味着解决方案不必是单独的应用程序。我完全可以让驱动程序或内核模块为我做这件事。请注意,虽然我从未做过任何内核或驱动程序编程,所以我会欣赏一些好的资源。

感谢您的指点!


使用XInput2使设备(键盘)浮动,然后监视设备上的KeyPress和KeyRelease事件,使用XTest重新生成KeyPress和KeyRelease事件。

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

Linux下删除/重写/生成键盘事件 的相关文章

  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 无需超级用户即可在 Linux 中打开 RAW 套接字

    我必须编写一个在 Linux 上运行的 ping 函数 语言是 C 所以 C 也可以 在网上搜索并查看源代码ping命令 事实证明我应该创建一个原始套接字 icmp sock socket AF INET SOCK RAW IPPROTO
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 在生产服务器上使用 Subversion 使文件生效的最佳方法是什么?

    目前我已经设置了 subversion 这样当我在 Eclipse PDT 中进行更改时 我可以提交更改 它们将保存在 home administrator 中项目文件 该文件具有 subversion 推荐的 branches tags
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • 如何捕获 X 错误?

    我尝试在网上搜索 但我必须注意 找到有关 X 编程这方面的材料并不容易 我使用 X 和 GLX 来创建 OpenGL 上下文 我已经知道我当前的显卡驱动程序仅支持 OpenGL API 版本 3 3 但我希望我的应用程序能够尝试创建任何类型
  • module_init() 与 core_initcall() 与 Early_initcall()

    在驱动程序中 我经常看到使用这三种类型的初始化函数 module init core initcall early initcall 在什么情况下我应该使用它们 另外 还有其他的初始化方式吗 它们决定内置模块的初始化顺序 司机们会使用dev
  • 检查已安装的软件包,如果没有找到则安装

    我需要检查已安装的软件包 如果未安装则安装它们 RHEL CentOS Fedora 示例 rpm qa grep glibc static glibc static 2 12 1 80 el6 3 5 i686 如何在 BASH 中进行检
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐