python evdev 设备有一个 .grab() 函数,可以防止其他进程获取设备上的输入事件。有没有办法将其限制为来自设备的特定事件?
对于我的示例,如果我 .grab() 一个具有压力感应和倾斜以及侧面 2 个单击按钮的笔输入设备,我将如何仅“抓取”两个单击按钮,但让其余的输入(提示,压力敏感度和倾斜度)是否被系统的其他部分正常捕获?
我的一个笔按钮通常是右键单击鼠标事件。我想让它做其他事情,但它仍然会弹出右键菜单,所以我试图弄清楚如何阻止它。
当事件发生时,我尝试进行抓取和取消抓取。喜欢事件 > 抢 > 做我的事 > 取消抢。但这显然为时已晚,操作系统仍然会弹出菜单。
我尝试进行完全抓取,然后在事件循环中,如果它是一个按钮按下做我的工作,否则通过将事件传回系统来创建一个 UInput 事件注入。这有点混乱。需要许可。当我终于克服了这个问题时,运动被抵消了,压力/倾斜不起作用......我认为这与实际上使这些东西工作的 DigiMend 驱动程序和/或我必须传递给的 xinput 设置有关校准数位板。但我对从头开始编写所有压力/倾斜功能或类似的东西不感兴趣,所以我需要 DigiMend 的东西才能正常工作。所以我暂时放弃了这个想法。
我唯一的另一个想法是弄清楚为什么操作系统默认为它所做的行为,看看我是否可以手动禁用这些操作(即为什么它认为该按钮是鼠标右键单击并让它认为该按钮什么都不是.)
所以我想这是一个3级的问题。
- 我可以在选择事件而不是整个设备上实现抓取功能吗?
- 如果直通的想法更好,有没有办法实现这一点而无需进行任何权限修改并能够传递确切的事件(即没有偏移量等我经历过?)
- 如果 evdev 没有这种能力,或者以另一种方式更容易做到,比如以某种方式禁用操作系统中笔的默认设置,我愿意接受建议。如果有帮助,我正在使用 Kubuntu 20.04。
任何帮助将不胜感激,如果需要更多信息,请告诉我,在此先感谢!