2017-12-24 33 views
1

현재 키보드 단축키를 통해 스크립트를 실행하는 데 AutoHotKey을 사용하고 있습니다. 필자는 파이썬에서의 프로그래밍이 AutoHotKey를 다루는 것보다 훨씬 더 낫고, 필자가 AutoHotKey 스크립트를 만질 때마다 나는 깨끗한 AutoHotkey 코드를 쓸 수 있기를 바란다. 백그라운드에서 실행되고 키보드 입력에 반응하는 Python 스크립트를 어떻게 만들 수 있습니까?

내가 삽입 키를 누를 때의이 내가 어떤 창에 hello world를 인쇄 단순히 AutoHotkey에 스크립트를 보자 :

foo(){ 
    send, "hello world" 
} 
Insert:: foo() 

는 어떻게 Windows에서 Python3에서 같은 일을 할 것입니까?

+1

아마도 AutoHotKey를 다시 작성하지 않으면됩니다. 주요 문제는 포커스입니다. AHK는 단축키에 대한 모든 입력을 스캔하는 것처럼 보입니다. 이것은 순수 파이썬 프로그램이 자체 윈도우에 포커스가있을 때만 입력을 받기 때문에 할 수없는 것입니다. macOS 나 linux에서 특별한 (그러나 다른) 시스템 훅에 의존해야한다. 다른 말로하자면, AHK는 시스템이보기 전에 모든 입력 활동을 보내기 위해 간단한 작업을하고 있습니다. – msw

+0

@msw : 나는 아직 '반항성 반입'을 할 수 없다는 것을 인정하지만 (https://xkcd.com/353/),이 일은 내가 이국적인 사람이 아니기 때문에 내가 유일한 사람인 것처럼 보이지 않는다. 그것을 할 수 있기를 바란다. 그래서 도서관이 없다면 이상 할 것이다. – Christian

+0

아마도 파이썬에서 AHK의 스크립팅 언어로 컴파일하는 파서를 작성해야할까요? – poke

답변

0

StackOverflow의 두 답변을 결합하여 (거의)이 문제를 해결할 수 있습니다.

  1. 사용 (tehvan에 의해) this 대답은 \n 필요없이 사용자로부터 하나 개의 문자에 읽는 방법 같은 getch()을 만들 수 있습니다. (대답에서 아래에 반복)
  2. this 대답 (Barafu Albino)의 Python3 버전을 사용하여 이전에 정의한 _Getch() 클래스를 별도의 프로세스에서 호출합니다.

다음 코드는 Python3 작동 프로세스뿐 아니라 삽입 키를 중지 어떤 키를 사용하여 있습니다.

# This code is a combination of two StackOverflow answers 
# (links given in the answer) 

# ------- Answer 1 by tehvan ----------------------------------- 
class _Getch: 
    """Gets a single character from standard input. 
     Does not echo to the screen.""" 
    def __init__(self): 
     try: 
      self.impl = _GetchWindows() 
     except ImportError: 
      self.impl = _GetchUnix() 

    def __call__(self): return self.impl() 

class _GetchUnix: 
    def __init__(self): 
     import tty, sys 

    def __call__(self): 
     import sys, tty, termios 
     fd = sys.stdin.fileno() 
     old_settings = termios.tcgetattr(fd) 
     try: 
      tty.setraw(sys.stdin.fileno()) 
      ch = sys.stdin.read(1) 
     finally: 
      termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 
     return ch 

class _GetchWindows: 
    def __init__(self): 
     import msvcrt 

    def __call__(self): 
     import msvcrt 
     return msvcrt.getch() 

getch = _Getch() 

# -------- Answer 2 by Barafu Albino (modified) ------- 
import _thread 

def input_thread(a_list): 
    _Getch().__call__() 
    a_list.append(True) 

def do_stuff(): 
    a_list = [] 
    _thread.start_new_thread(input_thread, (a_list,)) 
    print('Press any key to stop.') 
    while not a_list: 
     pass 
     # This is where you can put the stuff 
     # you want to do until the key is pressed 
    print('Stopped.') 

do_stuff() 
+0

명령 줄을 통해 스크립트를 시작하면 포커스가 없을 때 아무 것도하지 않습니다. – Christian

+0

죄송합니다. 사실입니다. 초점이 맞지 않습니다. 나는이 해결책을 얻으려고 노력하는 동안 당분간이 대답을 유지할 것이다. –

1

이 작업을 수행하려면 창문에 푹 빠져 있어야합니다. ctypes 또는 CFFI 모듈을 통해 수행해야 할 수도 있습니다. 왜냐하면 필요한 API가 pywin32에 존재하지 않기 때문입니다.

this page에 따르면, 세 가지 윈도우 API 호출을 사용해야합니다 : 키보드 후크를 설정 idHook WH_KEYBOARD_LL를 사용하여,