【问题标题】:Releasing all keys after disabling the keyboard in X11/Linux using xinput?使用 xinput 在 X11/Linux 中禁用键盘后释放所有键?
【发布时间】:2012-06-01 06:37:00
【问题描述】:

在 Linux 上使用 X11/Xorg 时,当您使用 xinput 禁用键盘(例如 xinput set-prop $ID "Device Enabled" 0)时,不会发送“key-up”事件(因为您已禁用键盘)。如果您在命令行上输入该命令,这很明显,它会表现得就像您按住“输入”键一样。这是因为该命令(禁用键盘)在您将手指从 Enter 键上移开之前运行。

此错误 (https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-input-evdev/+bug/724280) 和此博客文章 (http://blog.yjl.im/2010/12/using-xinput-to-disable-keyboard-mouse.html) 中对此进行了讨论。

我正在编写一个需要禁用键盘的程序,并希望避免这个问题。有什么方法/命令可以“释放当前按下的所有键”(可以在“禁用键盘”命令之后运行)?或者是否有一种命令/方法来“获取所有当前按下的键的列表”以及手动/以编程方式发送“键释放”事件的方法? (这样我可以禁用键盘,查看按下了哪些键,然后“释放”这些键)。

这可能吗?

【问题讨论】:

    标签: linux keyboard x11 xinput


    【解决方案1】:

    “我正在编写一个需要禁用键盘的程序,并希望避免这个问题”

    抓住键盘焦点并丢弃所有输入有什么问题?

    xinput 是一个相当生硬的工具并且你遇到了一个两年多前的错误,这意味着它不太可能得到修复。事实上,这个错误可能比这更早,并且可能被使用它的人视为“预期行为”。

    【讨论】:

    • 这是一种可能可行的有趣方法。我该怎么做?我最初在这里问“如何锁定键盘”stackoverflow.com/questions/10740067/… NB:我对X11编程不太了解,所以请简单一些。 :)
    • 这不是错误。如果您在 shell 上输入命令,按回车键将执行它,并且命令将在键被按下之前完成。只是在它前面睡一觉。
    【解决方案2】:

    您所体验的是终端仿真器如何处理键盘事件和 shell 反应的特殊性。当你按下 enter 时,shell 将执行给它的命令,你的命令 xinput ... 将在 enter 被按下之前完成。由于键盘被禁用,没有按键释放事件甚至会进入事件处理。

    这不是错误,这是一项功能。

    解决方法:在实际执行分离之前等待所有键被按下,或者只是在 xinput 命令之前添加一个睡眠(这些都是竞争条件,所以它不是 100% 可靠的)。

    即把它放在 shell 命令行上

    sleep 1 ; xinput set-prop $ID "Device Enabled" 0
    

    在实际执行 xinput 禁用之前会先休眠一秒钟。如果您不按住回车键,您应该会处于所需的状态。

    【讨论】:

    • 我知道这本身不是一个错误,但我想解决它:)“在实际执行分离之前等待所有键被按下”我该怎么做?
    • @Rory:XInput 协议允许查询每个输入设备的当前状态。 xinput 工具通过query-state 操作:xinput query-state $ID 在命令行上公开此协议功能,您需要处理此的输出,或者更好的是,直接使用协议而不需要这样辅助工具。
    • query-state 解决了部分问题(“按下了哪些键?”)。我怎样才能释放这些键?如果您将query-state 和答案添加到“如何释放密钥?”作为一个单独的答案,我会接受这个答案,你会得到因果报应。
    • @Rory:你不会释放它们。你等着,直到他们被释放。但说真的:你应该只是抓住键盘,而不是禁用输入事件。
    【解决方案3】:

    只需在 xinput set-prop $ID "Device Enabled" 0 之后模拟任何按键点击,在命令之前不需要睡眠时间

    xinput set-prop $ID "Device Enabled" 0 ; xdotool key z
    

    【讨论】:

    • 如果你也禁用鼠标输入,也使用xdotool click 1
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2022-10-21
    • 2019-03-05
    相关资源
    最近更新 更多