1

在 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)。

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

这可能吗?

4

3 回答 3

1

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

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

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

于 2012-05-25T17:20:22.497 回答
1

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

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

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

即把它放在shell命令行上

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

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

于 2012-05-26T20:49:58.170 回答
0

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

xinput set-prop $ID "Device Enabled" 0 ; xdotool key z
于 2014-05-03T23:04:14.543 回答