监听键盘事件而不捕获它们?

2023-12-22

我正在编写一个命令行应用程序,它侦听 X Windows 中的 Control 键释放事件,并在检测到这些事件时向另一个进程发出警报。

作为 GNU/Linux 的新手,我宁愿避免摸索 GCC,因此我正在寻找基于脚本的解决方案。由于我对 Python 有所了解,因此选择基于 Python 的解决方案似乎很自然,在互联网上查找示例并阅读 Python Xlib 文档之后,我将这个可以运行的程序组合在一起,但有一个警告:它会陷入困境事件而不是仅仅监听它们(我的意思是此类事件不再传递到它们最初定向到的应用程序)。

我通过运行“xev”追踪了控制键代码。由于我已经重新映射了修改键,因此在您的系统上它们可能会有所不同。

为了简单起见,我省略了处理外部进程的代码。

感谢您的帮助。

软件:

  • Python 2.7.2

  • Python Xlib 0.15 RC1

  • Perl v5.10.1

  • Debian GNU/Linux 版本:6.0.3

  • 内核版本:Linux debian 2.6.32-5-686

编辑:我不明白的是,键盘事件不会被捕获,除非它们被处理(在我的程序中,这意味着“print“KeyRelease””行被执行)。由于在我的代码中我没有在 Xlib 或事件对象上调用任何方法,所以我不明白处理的差异在哪里。

EDIT2:除了使用 Xlib 之外,还欢迎提出有关替代解决方案的建议。

EDIT3:我也了解 Perl,并且也欢迎有关 Perl 库的建议,只要它们不需要最新版本的系统库,就可以提供帮助,因为 Debian 在其存储库中可用的软件包和编译方面众所周知地落后如果库有很多依赖项,安装最新版本的库可能会很困难(我尝试安装 PyGTK,但在未能引用我安装的最新 GLib 后放弃了)。

    #!/usr/bin/env python

    from Xlib.display import Display
    from Xlib import X

    Control_R  = 64 # Keycode for right Control.
    Control_L  = 108 # Keycode for left Control.
    keycodes = [Control_R, Control_L] # Keycodes we are listening for.

    # Handle X events.
    def handle_event(event):
        # Let us know whether this event is about a Key Release of
        # one of the key we are interest in.
        if event.type == X.KeyRelease:
            keycode = event.detail
            if keycode in keycodes:
                print "KeyRelease"

    # Objects needed to call Xlib.
    display = Display()
    root = display.screen().root

    # Tell the X server we want to catch KeyRelease events.
    root.change_attributes(event_mask = X.KeyReleaseMask)

    # Grab those keys.
    for keycode in keycodes:
        root.grab_key(keycode, X.AnyModifier, 1, X.GrabModeAsync, X.GrabModeAsync)

    # Event loop.
    while 1:
        event = root.display.next_event()
        handle_event(event)

感谢 Croad Langshan 提到的 pykeylogger 库,以及该库的作者 Tim Alexander 提供的有用示例代码,我已经能够将程序更改为:

    #!/usr/bin/env python

    from pyxhook import HookManager

    watched_keys = ["Control_R", "Control_L"]

    def handle_event (event):
        if event.Key in watched_keys:
            print "KeyRelease"


    hm = HookManager()
    hm.HookKeyboard()
    hm.KeyUp = handle_event
    hm.start()

这个程序毫无问题地实现了我的目标。您可以阅读“event”对象的字段以获取有关事件的更多信息(请参阅“pyxhook.py”的源代码)。

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

监听键盘事件而不捕获它们? 的相关文章

随机推荐

  • HTML 表单/CSS - “位置”应该位于封闭的 DIV 或封闭的控件上吗?

    哪个是对的 div class TEdit div
  • Php Artisan 服务命令不服务 Laravel 5.8

    我安装了一个新的 Laravel 实例 使用版本 5 8 一路上 我发现我无法使用普通的 Laravel 为该项目提供服务php artisan serve命令 经过大量试验和错误的研究后 我发现了这个answer https stacko
  • 图像函数或 .insertImage 不适用于 Google Apps 脚本和表格

    我目前正在使用一个脚本 当某人提交表单时 自动从我的驱动器中提取他们的照片 我一直在使用 Google Sheets 的 image 函数以及以下脚本来实现此目的 function imageUpdate var images DriveA
  • 如何使用 HTML/JavaScript 强制下载?

    我有一个链接 如果用户单击它 我需要发生两件事 正确的 HTTP 响应会发送给用户 尤其是Content Type video mp4 并且视频文件将自动开始下载 我在 PHP 中见过类似的东西 但是只有 HTML JavaScript 才
  • C# - 垃圾收集

    好的 我了解堆栈和堆 值位于堆栈上 引用位于堆上 当我声明一个类的新实例时 它位于堆上 并引用堆栈上内存中的这一点 我还知道 C 有自己的垃圾收集 即 它确定实例化类何时不再使用并回收内存 我有两个问题 我对垃圾收集的理解是否正确 我可以自
  • 验证 Windows 文件名

    如何确定给定字符串是否是有效的 Windows 文件名 我正在考虑一些可以给出字符串并返回布尔值的函数 它应该检查不允许的字符 和保留字 CON PRN 等 isValidWindowsFilename readme txt true is
  • Rails 3 不适用于 Windows 7

    红宝石 1 8 7 宝石1 3 7 导轨 3 0 0 3 0 0 rc 当我写rails v时 错误信息来了 在任何 gem 源中都找不到 gem mysql2 0 runtime gt 尝试运行 捆绑安装 当我运行bundle insta
  • Java正则表达式匹配开始/结束标签导致堆栈溢出

    标准执行情况Java Pattern类使用递归来实现多种形式的正则表达式 例如 某些运算符 交替 这种方法会导致输入字符串超过 相对较小 长度的堆栈溢出问题 该长度甚至可能不超过 1 000 个字符 具体取决于所涉及的正则表达式 一个典型的
  • MS-SQL 按降序对输出进行排序

    我有一个 MS SQL 查询 数据库中有数千行记录 SELECT DISTINCT TOP 7 DATENAME MM mydatetime CAST DAY mydatetime AS VARCHAR 2 as thedate MONTH
  • MASM SEG 运营商

    假设我们正在使用 MASM 6 1 16 位 大数据模型编写汇编代码 并且我们有一个名为 MY VAR 的变量 标签 一个名为 MY SEG 的段和一个名为 MY GROUP 的段组 假设 MY VAR 放置在 MY SEG 中 并且 MY
  • 使用 Powershell 监听按键,但不要等待

    我正在尝试编写一个定期切换大写锁定键的脚本 但我也希望能够切换该脚本 因为它会导致其他功能出现一些问题 例如 alt tab 键 以及滚动任务栏中的窗口以查看预览 到目前为止我的脚本是 outer while true do echo To
  • 如何在 Blazor 中执行客户端 UI 事件

    我刚刚开始使用 Blazor 我已经看到了这个新框架的巨大潜力 不过 我想知道它将如何处理简单的事情 例如将焦点设置在输入控件上 例如 在处理单击事件后 我想将焦点设置到文本输入控件 我是否必须使用 JQuery 来完成类似的事情 或者 B
  • 使用 SQLAlchemy 正确的文件结构以及如何将数据添加到数据库

    我正在尝试构建一个简单的博客平台来学习Python和Flask 我正在使用 SQLAlchemy 连接到 Heroku 和 Flask s3 上托管的 Postgres 数据库 以提供来自 AWS 存储桶的静态文件 我主要是遵循这个 htt
  • google.maps.places 及其自动完成方法未定义

    我正在加载谷歌地图 API https developers google com maps documentation javascript jQuery http jquery com 和这个地理完整 http ubilabs gith
  • 在 Spring 框架下:警告:警告找不到记录器的附加程序(org.springframework.web.context.ContextLoader)

    我花了一整天的时间试图解决 web 应用程序中使用 log4j 时遇到的日志记录问题 无论我做什么 我都无法摆脱以下问题 log4j WARN No appenders could be found for logger org sprin
  • 如何在 python 中正确打印 unicode 字符列表?

    我正在尝试在 python 字符串中搜索表情符号 所以我有 例如 em test U0001f680 print em test test This is a test string if any x in test for x in em
  • 将文本识别为简体中文与繁体中文

    给定一段已知为中文且以 UTF 8 编码的文本块 有没有办法确定它是简体还是繁体 我不知道这是否有效 但我会尝试使用 iconv 来查看它是否能在字符集之间正确转换 并将相同转换的结果与 TRANSLIT 和 IGNORE 进行比较 如果两
  • Opera Unite 和 Node.js 有什么区别?

    两者似乎都允许完全使用 JavaScript 编写应用程序 两者都允许服务器端 JS 和客户端 JS 那么 从技术和编程的角度来看 两者有什么区别呢 Opera Unite 是一种协作技术 它使用 Opera 桌面浏览器内的紧凑型服务器来共
  • 查询矩形集合以查找输入矩形的重叠

    在多维空间中 我有一组矩形 所有矩形都与网格对齐 我宽松地使用 矩形 这个词 在三维空间中 它们将是矩形棱柱 我想查询此集合中与输入矩形重叠的所有矩形 保存矩形集合的最佳数据结构是什么 我会不时地向集合中添加矩形和从集合中删除矩形 但这些操
  • 监听键盘事件而不捕获它们?

    我正在编写一个命令行应用程序 它侦听 X Windows 中的 Control 键释放事件 并在检测到这些事件时向另一个进程发出警报 作为 GNU Linux 的新手 我宁愿避免摸索 GCC 因此我正在寻找基于脚本的解决方案 由于我对 Py