2013-06-05 7 views
1

키 보드를 프로그램에 추가하여 클립 보드를 편집 한 다음 변경 사항을 활성 창에 붙여 넣으려고합니다. Windows에서 나는 아마도 메시지 전달과 함께 그것을 할 수 있다고 생각하지만, X는 이와 같은 메시지 전달을 사용하지 않기 때문에 이것을 수행하기 위해 나는 단지 python-evdev을 사용하여 ctrl + v 이벤트를 uinput으로 보냈습니다. 이것은 당신이 방금 실행할 때 합리적으로 잘 작동하지만, 키 바인딩 (이 경우에는 super + v)에서 실행해야합니다. 문제는 ctrl 및 v 이벤트를 uinput으로 보낼 때 수퍼 마스크가 여전히 활성 상태이므로 ctrl + v를 창에 보내지 않고 실제로 아무것도 수행하지 않는 Ctrl + super + v를 보냅니다. 당신은 매우 신속하게 해제 당신이 실제로 일을 얻을 수있는 경우마스크 키가있는 키 바인딩 문제로 인해 파이썬 - evdev로 이벤트를 보내려합니다.

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

하지만, 실제 응용 프로그램에 대해 분명히 허용하지 꽤 빨리 그리고 다음은 최소한의 코드는 내가 무슨 말을하는지 설명이다. 나는 슈퍼를 풀려고했지만 몇 가지 문제가있다. 매우 일반적인 것이 아니기 때문에 나중에 할 일의 문제가 제기됩니다 (놓아 둡니다. 다시 누르십시오. 놓아 두었다가 다시 누르는 사이에 릴리스하면 어떻게됩니까?). 가장 중요한 것은 그렇지 않습니다. 실제로 작동하는 것 같습니다.

어쨌든, 나는이 문제를 해결할 방법이 있습니까? 아마도 물리적 인 키보드와 결합하지 않는 키 누르기 이벤트를 보낼 수있는 방법일까요? 그렇지 않다면 Linux에 일반적으로 붙여 넣기위한 더 좋은 방법이 있습니까?

답변

0

나는 해결책이 없다고 생각합니다. Ctrl-V가 이 아니고이 아닌 "붙여 넣기"작업을 시작하는 데 사용되는 IPC 메커니즘 인 경우,이 작업을 수행하는 일반적인 키 바인딩 일뿐입니다 (이맥이 실행되는 경우 트릭이 작동하지 않음에 유의하십시오. 전경, 가젯이 페이지를 창 위로 스크롤합니다). 그리고 나는 당신이 옳다고 생각합니다. 예를 들어 freedesktop.org에서 창을 "지금 붙여 넣기"할 것을 요구하는 표준이 없으며 정말로 있어야합니다.

적어도 앱에서 일반적으로 이해하고 구현하는 것처럼 붙여 넣기는 사용자가 시작한 작업입니다. 어떤 앱도 외부 도구에 의해 구동 될 것으로 기대하지 않습니다. 당신이 해결하려고하는 실제 문제는 무엇입니까? 클라이언트 응용 프로그램에서 실행하거나 액세스 가능성/입력 메소드 프레임 워크를 대신 연결할 수 있습니까?

그건 : 나는 당신이이 특별한 해킹 작업을하고 싶다면 올바른 접근법을 가지고 있다고 생각한다. 쿼리는 작업 시작시 키맵을 지정하고 수정 자 키의 상태를 지우고 이벤트를 보낸 다음 상태를 다시 설정합니다. 하드웨어 키보드와 비교할 때 아직 해결할 수없는 경주가 있지만 분명히 큰 문제는 아닐 것입니다.

+0

불행히도, "나는 정말로 노력하고 있습니다"라고 말한 것은 정확히 내가 말했던 것입니다. 나는 매우 솔직하게 노력했습니다. 텍스트를 보내거나 문제를 해결하기 위해 영리한 방법으로 사용하지 않고 클립 보드 데이터를 가져오고 붙여 넣으려고합니다. 문제는 매번이 앱의 붙여 넣기 기능을 사용하고 싶지 않다는 것입니다. 그렇지 않으면 클립 보드를 채우고 사용자가 그 클립을 채울 수있게됩니다. 이맥스 문제는 응용 프로그램에서 스크립트를 작성할 수 있으므로 정상적으로 작동하지 않는 곳으로 붙여 넣을 수있는 키 바인딩 (예 : super + shift + v)을 추가 할 수 있습니다. 감사합니다 – Josiah

+0

어쩌구, 나는 그 마지막 코멘트를 역겨운 것으로 계속 읽는다. 나는 더 좋은 방법을 생각할 수 없었고, 그것을 수정할 시간이 없었으므로 실수로 그것을 새말을 삽입 할 때 제출했습니다. 그냥 그 의미가 아니라는 것을 알아, 나는 당신의 응답을 주셔서 감사합니다. – Josiah

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

을 당신이 볼 수 있듯이, 당신은 그것을 얻기의 모기의 tadger 내에서 있었다.
추가 된 코드는 필요한 Ctrl + v 전에 Super 키를 끈 다음 나중에 다시 켜기 만하면됩니다.

+0

글쎄,이 응용 프로그램은 기본적으로 지금 시점에서 포기합니다. 나는 이것을 시도했다 (잠시 있었지만 질문에 언급 된 것처럼 보인다). 그러나 나는 경쟁 조건의 문제에 부딪쳤다. 사용자가 붙여 넣기 전에 super를 잡고 있었다면 다시 넣을 수는 있지만 붙여 넣기 후 super를 릴리스 할 수도 있지만 쓰기가 끝나기 전에 가능합니다. 그런 다음 다시 누를 때까지 슈퍼 버튼이 눌려 있습니다. 대체하지 않으면 두 번 이상 붙여 넣을 수 없습니다. 마지막 해결책은 사용자가 상황에 맞는 메뉴에서 클립 보드를 수동으로 채우도록 선택하거나 자동으로 그렇게 할 수있는 옵션을 설정하는 것입니다. – Josiah