python - 使用 python-evdev 将事件发送到 uinput 关于掩码键的键绑定(bind)问题

标签 python linux input evdev

简而言之,我正在尝试向我的程序添加一个键绑定(bind),它将编辑剪贴板,然后将更改粘贴到您激活的任何窗口。在 Windows 上,我想我可以通过消息传递来实现,但 X 不使用那样的消息传递,所以为了做到这一点,我只使用 python-evdev向 uinput 发送 ctrl+v 事件。当您运行它时,它运行得相当好,但我需要它在键绑定(bind)上运行,在本例中为 super+v。问题是,当您将 ctrl 和 v 事件发送到 uinput 时, super 掩码仍然处于事件状态,因此它不会将 ctrl+v 发送到窗口,而是发送 ctrl+super+v,这实际上什么都不做。这里有最少的代码来准确解释我在说什么:

import evdev,time,keybinder,gtk

def callback():
    with evdev.UInput() as uinput:
        uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_LEFTCTRL, 1)
        uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_V, 1)
        uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_V, 0)
        uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_LEFTCTRL, 0)
        uinput.syn()

keybinder.bind("<super>v",callback)
keybinder.bind("Escape",gtk.main_quit)
gtk.main()

如果您发布得足够快,您实际上可以让它工作,但它的速度非常快,对于实际应用程序来说显然是 Not Acceptable 。我试过发布 super 但这引起了一些问题;它不是很通用,它提出了之后要做什么的问题(让它释放?再按一次?如果他们在你释放然后再次按下之间的时间内释放怎么办?),最重要的是,它不会似乎真的有效。

无论如何,我想问题是,有什么办法可以解决这个问题吗?也许是一种发送不会与物理键盘结合使用的按键事件的方法(不太可能)?如果没有,是否有更好的方法让它在 Linux 上通用粘贴?

最佳答案

我认为这没有解决方案。正如您清楚地已经了解的那样,Ctrl-V 不是用于启动“粘贴”操作的 IPC 机制,它只是执行此操作的通用键绑定(bind)(请注意,如果发生这种情况,您的技巧将不起作用让 emacs 在前台运行,您的小工具只会将窗口向上滚动一页)。我认为您是对的,没有标准(例如 freedesktop.org 上的标准)要求窗口“立即粘贴”,也不应该有标准。

至少按照应用程序普遍理解和实现的那样,粘贴是用户启动的操作。没有应用会期望它由外部工具驱动。您要解决的实际问题是什么?你不能绑定(bind)一些东西在你的客户端应用程序中运行,或者 Hook 一个辅助功能/输入法框架吗?

就是说:如果您想使这个特殊的 hack 工作,我认为您有正确的方法。在操作开始时查询它们的键盘映射,清除任何修改键的状态,发送您的事件,然后重置状态。显然,您与硬件键盘之间的竞争仍然无法解决,但我怀疑在实践中这不会是一个大问题。

关于python - 使用 python-evdev 将事件发送到 uinput 关于掩码键的键绑定(bind)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16951123/

相关文章:

python - Altair pandas 值计数水平条形图

python - 如何使用python(Anaconda)使用vba在指定的单元格位置将图片插入到Excel中

php - 使用 PHP 检查 IPv4/IPv6 地址是否已启动

linux - 使用粘性位无需 sudo 即可挂载?

c++ - 在 C++ 上使用 fflush

Python:循环不等待用户的输入

python - 在django中单页上传两个文件

python - 在 django 中不使用交互式 python shell 将值插入数据库表

c - 读取用户输入,直到在 C 中按下 ESC

没有插件的 Javascript 输入文本屏蔽