【问题标题】:Disable keyboard but keep getting events禁用键盘但不断收到事件
【发布时间】:2018-09-15 00:10:56
【问题描述】:

我有一台触摸屏笔记本电脑,它可以折叠得足以像平板电脑一样。如果我把它放在桌子上,我不想意外地敲击键,所以我正在编写一个脚本,当我按下 Ctrl-F10 时禁用键盘,然后在我再次这样做时重新启用它。我正在使用来自 PyPI 的xlib,到目前为止我已经得到了这个:

from Xlib.display import Display
from Xlib.ext import xinput

class Handler:
    def __init__(self, display):
        self.enabled = True
        self.display = display

    def handle(self, event):
        if event.data['detail'] == 76 and event.data['mods']['base_mods'] == 4:
            if self.enabled:
                self.display.grab_server()
            else:
                self.display.ungrab_server()
            self.enabled = not self.enabled

try:
    display = Display()
    handler = Handler(display)
    screen = display.screen()
    screen.root.xinput_select_events([
        (xinput.AllDevices, xinput.KeyPressMask),
    ])
    while True:
        event = display.next_event()
        handler.handle(event)
finally:
    display.close()

它确实禁用了 Ctrl-F10 上的键盘,但是一旦我重新启用,我在禁用它时按下的所有键都会立即全部激活。有没有办法在重新启用之前清除队列,或者有更好的方法来禁用键盘?

【问题讨论】:

    标签: python xlib


    【解决方案1】:

    试试XGrabKeyboardhttps://tronche.com/gui/x/xlib/input/XGrabKeyboard.html

    (但这需要您创建自己的抓取窗口;例如,您可以在 -10x-10 位置创建大小为 1x1 的窗口)

    我认为owner_eventskeyboard_mode 之类的值并不重要。主要效果应该是输入焦点转到您自己的窗口。 time 应该是CurrentTime(也就是0),pointer_mode 应该是GrabModeAsync,这样就不会干扰指针了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多