> 백엔드 개발 > 파이썬 튜토리얼 > 터미널에서 실행되는 Python 스크립트에서 키보드 입력을 어떻게 감지할 수 있나요?

터미널에서 실행되는 Python 스크립트에서 키보드 입력을 어떻게 감지할 수 있나요?

Linda Hamilton
풀어 주다: 2024-10-29 17:37:02
원래의
783명이 탐색했습니다.

How can you detect keyboard input in Python scripts running from the terminal?

터미널에서 Python 스크립트의 키보드 입력 감지 구현

Python 스크립트가 실행되는 동안 터미널에서 키보드 입력을 감지하려면 몇 가지 옵션이 있습니다. 장점 및 제한 사항:

동기식/차단 키 캡처

  • 간단한 input() 또는 raw_input(): 사용자가 Enter를 누를 때까지 스크립트 실행을 중단하는 Python 함수 , 입력된 텍스트를 제공합니다.
<code class="python">typedString = raw_input()</code>
로그인 후 복사
  • 단순 차단 키 누르기 캡처:
<code class="python">import msvcrt
k=msvcrt.getch()</code>
로그인 후 복사

비동기 키 캡처

  • 키를 눌렀을 때 콜백:
<code class="python">import win32api, time
from win32api import STD_INPUT_HANDLE
from win32console import GetStdHandle, KEY_EVENT, ENABLE_LINE_INPUT, ENABLE_ECHO_INPUT, ENABLE_PROCESSED_INPUT

from keyPress import KeyPress

class CaptureLines():
    def __init__(self):
        self.isCapturingInputLines = False

        self.inputLinesHookCallback = CFUNCTYPE(c_int)(self.inputLinesHook)
        self.pyosInputHookPointer = c_void_p.in_dll(pythonapi, "PyOS_InputHook")
        self.originalPyOsInputHookPointerValue = self.pyosInputHookPointer.value

        self.readHandle = GetStdHandle(STD_INPUT_HANDLE)
        self.readHandle.SetConsoleMode(ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT|ENABLE_PROCESSED_INPUT)


    def inputLinesHook(self):
        self.readHandle.SetConsoleMode(ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT|ENABLE_PROCESSED_INPUT)
        inputChars = self.readHandle.ReadConsole(10000000)
        self.readHandle.SetConsoleMode(ENABLE_LINE_INPUT|ENABLE_PROCESSED_INPUT)

        if inputChars == "\r\n":
            KeyPress("\n")
            return 0

        inputChars = inputChars[:-2]

        inputChars += "\n"

        for c in inputChars:
            KeyPress(c)

        self.inputCallback(inputChars)

        return 0</code>
로그인 후 복사

폴링

  • 차단 없는 간단한 키 캡처:
<code class="python">import win32api, time
from win32api import STD_INPUT_HANDLE
from win32console import GetStdHandle, KEY_EVENT, ENABLE_LINE_INPUT, ENABLE_PROCESSED_INPUT

class KeyAsyncReader():
    def __init__(self):
        self.readHandle = GetStdHandle(STD_INPUT_HANDLE)
        self.readHandle.SetConsoleMode(ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT|ENABLE_PROCESSED_INPUT)

    def poll(self):
        return self.readHandle.ReadConsoleInput()</code>
로그인 후 복사

로봇

  • 키보드 이벤트의 프로그래밍 방식 실행:
<code class="python">import ctypes
from ctypes import wintypes
import time

user32 = ctypes.WinDLL('user32', use_last_error=True)

INPUT_MOUSE    = 0
INPUT_KEYBOARD = 1
INPUT_HARDWARE = 2

KEYEVENTF_EXTENDEDKEY = 0x0001
KEYEVENTF_KEYUP       = 0x0002
KEYEVENTF_UNICODE     = 0x0004
KEYEVENTF_SCANCODE    = 0x0008

MAPVK_VK_TO_VSC = 0

# C struct definitions
wintypes.ULONG_PTR = wintypes.WPARAM

SendInput = ctypes.windll.user32.SendInput

PUL = ctypes.POINTER(ctypes.c_ulong)

class KEYBDINPUT(ctypes.Structure):
    _fields_ = ((&quot;wVk&quot;,         wintypes.WORD),
                (&quot;wScan&quot;,       wintypes.WORD),
                (&quot;dwFlags&quot;,     wintypes.DWORD),
                (&quot;time&quot;,        wintypes.DWORD),
                (&quot;dwExtraInfo&quot;, wintypes.ULONG_PTR))

class MOUSEINPUT(ctypes.Structure):
    _fields_ = ((&quot;dx&quot;,          wintypes.LONG),
                (&quot;dy&quot;,          wintypes.LONG),
                (&quot;mouseData&quot;,   wintypes.DWORD),
                (&quot;dwFlags&quot;,     wintypes.DWORD),
                (&quot;time&quot;,        wintypes.DWORD),
                (&quot;dwExtraInfo&quot;, wintypes.ULONG_PTR))

class HARDWAREINPUT(ctypes.Structure):
    _fields_ = ((&quot;uMsg&quot;,    wintypes.DWORD),
                (&quot;wParamL&quot;, wintypes.WORD),
                (&quot;wParamH&quot;, wintypes.WORD))

class INPUT(ctypes.Structure):
    class _INPUT(ctypes.Union):
        _fields_ = ((&quot;ki&quot;, KEYBDINPUT),
                    (&quot;mi&quot;, MOUSEINPUT),
                    (&quot;hi&quot;, HARDWAREINPUT))
    _anonymous_ = (&quot;_input&quot;,)
    _fields_ = ((&quot;type&quot;,   wintypes.DWORD),
                (&quot;_input&quot;, _INPUT))

LPINPUT = ctypes.POINTER(INPUT)

def _check_count(result, func, args):
    if result == 0:
        raise ctypes.WinError(ctypes.get_last_error())
    return args

user32.SendInput.errcheck = _check_count
user32.SendInput.argtypes = (wintypes.UINT, # nInputs
                             LPINPUT,       # pInputs
                             ctypes.c_int)  # cbSize

def KeyDown(unicodeKey):
    key, unikey, uniflag = GetKeyCode(unicodeKey)
    x = INPUT( type=INPUT_KEYBOARD, ki= KEYBDINPUT( key, unikey, uniflag, 0))
    user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))

def KeyUp(unicodeKey):
    key, unikey, uniflag = GetKeyCode(unicodeKey)
    extra = ctypes.c_ulong(0)
    x = INPUT( type=INPUT_KEYBOARD, ki= KEYBDINPUT( key, unikey, uniflag | KEYEVENTF_KEYUP, 0))
    user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))

def KeyPress(unicodeKey):
    time.sleep(0.0001)
    KeyDown(unicodeKey)
    time.sleep(0.0001)
    KeyUp(unicodeKey)
    time.sleep(0.0001)


def GetKeyCode(unicodeKey):
    k = unicodeKey
    curKeyCode = 0
    if k == &quot;up&quot;: curKeyCode = 0x26
    elif k == &quot;down&quot;: curKeyCode = 0x28
    elif k == &quot;left&quot;: curKeyCode = 0x25
    elif k == &quot;right&quot;: curKeyCode = 0x27
    elif k == &quot;home&quot;: curKeyCode = 0x24
    elif k == &quot;end&quot;: curKeyCode = 0x23
    elif k == &quot;insert&quot;: curKeyCode = 0x2D
    elif k == &quot;pgup&quot;: curKeyCode = 0x21
    elif k == &quot;pgdn&quot;: curKeyCode = 0x22
    elif k == &quot;delete&quot;: curKeyCode = 0x2E
    elif k == &quot;\n&quot;: curKeyCode = 0x0D

    if curKeyCode == 0:
        return 0, int(unicodeKey.encode(&quot;hex&quot;), 16), KEYEVENTF_UNICODE
    else:
        return curKeyCode, 0, 0</code>
로그인 후 복사

위 내용은 터미널에서 실행되는 Python 스크립트에서 키보드 입력을 어떻게 감지할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿