프로그래밍/Python

python pynput모듈의 사용을 통한 마우스/키보드 제어

꿈꾸는 사람_Anthony 2020. 12. 1. 00:21
반응형

현재 마우스/키보드 관련 제어모듈로 keyboard모듈, puautogui모듈 등 다양한 모듈이 나온 것으로 알고 있다.

이번에는 pynput을 사용했다.

사용법이야 뭐 https://pypi.org/project/pynput/

 

pynput

Monitor and control user input devices

pypi.org

에 너무 설명이 잘 되어있다. 설치도 간단(pip insall pynput)

필자가 사용한 것은 키보드 listening과 controller이다. 

추가적으로, pyautogui의 경우, 왜인지는 모르겠으나, pyautogui.hotkey()가 작동되지 않아 pynput으로 대체하였다.

이를 사용하고자 한다면, pynput의 listening을 통해 16진수코드를 알아내고 그것을 controller로 press하면 된다.

 

차근차근 해보자.

from pynput import keyboard

def on_press(key):
    try:
        print('alphanumeric key {0} pressed'.format(
            key.char))
    except AttributeError:
        print('special key {0} pressed'.format(
            key))

def on_release(key):
    print('{0} released'.format(
        key))
    if key == keyboard.Key.esc:
        # Stop listener
        return False

# Collect events until released
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

# ...or, in a non-blocking fashion:
listener = keyboard.Listener(
    on_press=on_press,
    on_release=on_release)
listener.start()

필자는 첫번째, with keyboard.Listener(...을 사용하였다.

그리고 구현해야하는 것들을 모두 on_press()함수와 on_release()함수에 집어 넣고 실행하였다.

해당 코드를 실행하면 ctrl+c가 \x03, ctrl+v가 \x16인 것을 알 수 있다.

(위 코드 입맛에 맞게 조리한 뒤)

from pynput import keyboard

def on_press(key):
    print('{0} pressed'.format(key))

def on_release(key):
    print('{0} released'.format(key))
    if key == keyboard.Key.esc:
        # Stop listener
        return False

# Collect events until released
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

 

그리고 이를 적용해

from pynput.keyboard import Key, Controller

keyboard = Controller()

keyboard.press('\x16')
keyboard.release('\x16')

위를 실행한다면, ctrl+v가 입력된 것과 마찬가지의 효과를 낸다.

 

마지막으로 이 모듈을 사용한다면, 다른 모듈들로 입력할 수 없던 한글을 입력할 수 있다.

물론 keyboard.type()로는 불가능 하다.

IME를 한글로 설정하고 press 와 release를 적절히 사용한다면 가능하다. 

이러고 안되는 줄 알았으나 가능하다. 취소선 해놓은 방법으로도 가능하다.

from pynput.keyboard import Key, Controller

keyboard = Controller()
keyboard.type('안녕하세요.')

 

반응형