1

要するに、クリップボードを編集し、アクティブなウィンドウに変更を貼り付けるキーバインドをプログラムに追加しようとしているということです。Windowsではおそらくメッセージパッシングでできると思いますが、Xはそのようなメッセージパッシングを使用しないため、これを行うために、python-evdevを使用してctrl + vイベントをuinputに送信しています。これは、実行するだけではかなりうまく機能しますが、キーバインドで実行する必要があります。この場合は 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に一般的に貼り付けるためのより良い方法はありますか?

4

2 に答える 2

0

<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()

ご覧のとおり、あなたはそれを手に入れるためのブヨのタジャーの範囲内にいました.
追加されたコードは、Super必要な Ctrl+v の前にキーをオフにし、その後再びオンに戻すだけです。

于 2016-03-29T15:00:02.097 に答える