发送带有keyundev绑定的事件的pythodev有问题

2024-05-16 16:29:58 发布

您现在位置:Python中文网/ 问答频道 /正文

简而言之,我正在尝试向我的程序添加一个keybinding,它将编辑剪贴板,然后将更改粘贴到任何活动窗口。在Windows上,我想我可以用消息传递来完成,但是X没有像这样使用消息传递,所以为了做到这一点,我只使用python-evdev向uinput发送一个ctrl+v事件。当您只运行它时,它的工作相当好,但是我需要它在keybinding上运行,在本例中是super+v。问题是当您将ctrl和v事件发送到uinput时,super mask仍然处于活动状态,因此它没有将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上通用粘贴呢?在


Tags: keygtk粘贴callback事件writectrlsuper
2条回答

您需要找到一种方法来确定<super>键当前是否被按下。
在wxpython中是Super = wx.GetKeyState(wx.WXK_META),我不知道在Gtk中会是什么。
那么您的代码如下:

def callback():
   Super = wx.GetKeyState(wx.WXK_META) # Here you require the Gtk equivalent 
   with evdev.UInput() as uinput:
        if Super:
            uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_LEFTMETA, 0)
        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)
        if Super:
            uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_LEFTMETA, 1)
        uinput.syn()

正如你所看到的,你离得到它只有一步之遥。
添加的代码只需在您需要的Ctrl+v之前关闭Super键,然后再打开。在

我不认为这有解决办法。正如您已经清楚地了解到的那样,Ctrl-V是一种用于启动“粘贴”操作的IPC机制,它只是一种常见的键绑定(注意,如果您碰巧在前台运行emacs,您的小工具只会将窗口向上滚动一页,您的技巧就行不通了)。我认为你是对的,没有标准(例如免费桌面.org)要求一个窗口“马上粘贴”,其实也不应该有。在

至少正如应用程序通常理解和实现的那样,粘贴是一种用户发起的操作。没有一个应用程序会期望它由外部工具驱动。你想解决的实际问题是什么?你不能绑定一些东西在你的客户端应用程序中运行,或者用一个辅助功能/输入方法框架来代替?在

也就是说:我认为如果你想让这一特定的黑客行为奏效,你的方法是正确的。在操作开始时查询它们的keymap,清除任何修改键的状态,发送事件,然后重置状态。显然,你仍然有一个无法解决的比赛与硬件键盘,但我怀疑在实践中,这不会是一个大问题。在

相关问题 更多 >