使用xinput在X11 / Linux中禁用键盘后释放所有的键?

在Linux上,当使用X11 / Xorg时,当你使用xinput来禁用他们的键盘时(例如xinput set-prop $ID "Device Enabled" 0 ),'key-up'事件不会被发送(因为你禁用了键盘)。 如果你在命令行中input这个命令,这是显而易见的,它会像你持有“进入”一样。 这是因为命令(禁用键盘)运行之前,您的手指离开回车键。

这个bug在这里讨论( 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 )。

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

这可能吗?

Solutions Collecting From Web of "使用xinput在X11 / Linux中禁用键盘后释放所有的键?"

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

抓住键盘焦点和丢弃所有输入有什么不对?

xinput是一个相当钝的工具你正在碰到一个超过两年的错误,这意味着它不太可能得到修复。 事实上,这个错误可能远远大于这种情况,可以被某个人用来做“预期的行为”。

你所遇到的是终端仿真器如何处理键盘事件和shell反应的一个特点。 当你按下回车键的时候shell会执行给它的命令,而你的命令xinput ...会在输入完成之前完成。 由于键盘被禁用,键释放事件甚至不会进入事件处理。

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

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

即把这个在shell命令行上

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

在实际执行xinput禁用之前,会先睡一会儿。 如果你不按住回车键,你应该出现在所需的状态。

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

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