简而言之,我正在尝试向我的程序添加一个键绑定,该程序将编辑剪贴板,然后将更改粘贴到您处于活动状态的任何窗口中。在 Windows 上,我想我可能可以通过消息传递来做到这一点,但 X 不会像那样使用消息传递,所以为了做到这一点,我只是使用python-evdev向 uinput 发送一个 ctrl+v 事件。当您只运行它时,它运行得相当好,但我需要它在键绑定上运行,在这种情况下是 super+v。问题变成当你发送 ctrl 和 v 事件到 uinput 时,超级掩码仍然处于活动状态,所以它不是发送 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()
如果你发布的速度足够快,你实际上可以让它工作,但它非常快,显然对于实际应用程序来说是不可接受的。我试图发布 super 但这会引发一些问题;它不是很通用,它提出了之后要做什么的问题(让它释放?再按一次?如果他们在你释放然后再次按下它之间的时间内释放怎么办?),最重要的是,它没有似乎真的有效。
无论如何,我想问题是,有没有办法解决这个问题?也许一种发送不会与物理键盘结合的按键事件的方法(不太可能)?如果没有,有没有更好的方法让它在 Linux 上通用粘贴?