Python evdev库是否具有特定于事件的抓取或传递



python evdev设备具有.grab((函数,该函数可防止其他进程在设备上获取输入事件。有什么方法可以将其限制在设备的特定事件中吗?

例如,如果我.grab((是一个具有压力敏感度和倾斜以及侧面有2个点击按钮的笔输入设备,我如何只"抓住"2个点击按键,而让其余的输入(尖端、压力敏感度以及倾斜(像往常一样被系统的其余部分捕获?

我的一个笔按钮通常是鼠标右键单击事件。我想让它做其他事情,但它仍然会弹出右键菜单,所以我正在想办法阻止它。

当事件发生时,我尝试了抓取和取消抓取。点赞事件>抓取>做我的事>ungrab。但显然为时已晚,操作系统仍然会弹出菜单。

我尝试了完全抓取,然后在事件循环中,如果是按钮按下,就做我的事情,否则只需将事件传递回系统即可创建UInput事件注入。这有点混乱。权限是必需的。当我终于克服了这一点时,运动被抵消了,压力/倾斜不起作用。。。我认为这与DigiMend驱动程序有关,它实际上使这些东西起作用,和/或我必须通过xinput设置来校准平板电脑。但我对从头开始写所有的压力/倾斜功能或诸如此类的东西不感兴趣,所以我需要DigiMend的东西才能正常工作。所以我暂时放弃了这个想法。

我唯一的另一个想法是弄清楚为什么操作系统默认为它所做的行为,看看我是否可以手动禁用这些操作(即,为什么它认为那个按钮是鼠标右键点击,并让它认为这个按钮什么都不是。(

所以我想这是一个三级问题。

  1. 我可以在选择事件而不是整个设备上实现抓取功能吗
  2. 如果传递的想法更好,有没有一种方法可以实现这一点,而不必进行任何权限修改,并且能够传递确切的事件(即没有偏移,我经历过这种情况?(
  3. 如果evdev没有这个功能,或者用另一种方式更容易做到,比如以某种方式禁用操作系统中笔的默认值,我愿意接受建议。如果有帮助的话,我会使用Kubuntu 20.04

如果需要任何帮助,请告诉我是否需要更多信息,提前感谢!

我最终选择了#3并使用了xinput。我想我现在会给出这个答案,以防其他人遇到这个问题并想做类似的事情。

解决方法其实有点简单。我只是用xinput重新映射2个按钮。所以evdev根本不需要抓取。只要禁用这些按钮,一切都会正常进行,除了我用evdev监听的那些按钮。

xinput set-button-map {} 1 0 0 4 5 6 7

我的设备有7个按钮,通常映射为1-7。这些都是鼠标左键单击、中键单击、右键单击等的等价物…

通过使用该字符串并传递{}的设备ID,我只需首先使用子流程运行它。瞧,再也没有右键菜单了。我可以使用evdev将事件映射到我想要的任何内容。

相关内容

  • 没有找到相关文章

最新更新