1. ホーム
  2. python

[解決済み] キーボードイベントを発生させるには?

2022-10-19 10:06:06

質問

短い要約です。

私はキーボードイベントをコンピュータに送信するプログラムを作成しようとしています。すべての目的のために、シミュレートされたイベントは、キーボード上の実際のキーストロークとして扱われるべきです。

元の投稿

私は、pythonを使用してキーボードイベントを生成する方法を探しています。

この関数は、押すことをシミュレートしなければならないキーを受け取ると仮定して、以下のようにします。

keyboardevent('a') #lower case 'a'
keyboardevent('B') #upper case 'B'
keyboardevent('->') # right arrow key

def keyboardevent(key):
    #code that simulated 'key' being pressed on keyboard

上記は明らかに例ですが、私が探しているのは、キーボードイベントをシミュレートするために使用できるライブラリ、モジュール、または何かです。

ノート : これは、メモ帳に文字を送ったり、フィールドにテキストを入力したりするのとは違います。Pythonスクリプトで実際のキーボードイベントをシミュレートして、コンピュータは本当にキーボードイベントがあると思うようにしたいのです。

おまけです。

微妙な違いですが、アクティブウィンドウの中には特定のキーの組み合わせを受け付けないものがあります。

ここまでで、私はこれらについて見てきました。

最前面のアプリケーションのキーボードイベントを発生させる

Pythonを使ってキーボードの押下イベントを生成するには?

というのは、すべてappleに関するもので、まったく役に立ちませんでした。

そして、これ。

Pythonでキーボードとマウスをシミュレートする最も簡単な方法はどれですか?

それは私が必要とするものかもしれないように見えるが、私はそれのためのライブラリや任意のドキュメントを見つけることができません。

私はより多くの場所を同様に探しましたが、まだ解決策を見つけることができません。

どのように解決するのですか?

ctypesを使用して行うことができます。

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

# msdn.microsoft.com/en-us/library/dd375731
VK_TAB  = 0x09
VK_MENU = 0x12

# C struct definitions

wintypes.ULONG_PTR = wintypes.WPARAM

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

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

    def __init__(self, *args, **kwds):
        super(KEYBDINPUT, self).__init__(*args, **kwds)
        # some programs use the scan code even if KEYEVENTF_SCANCODE
        # isn't set in dwFflags, so attempt to map the correct code.
        if not self.dwFlags & KEYEVENTF_UNICODE:
            self.wScan = user32.MapVirtualKeyExW(self.wVk,
                                                 MAPVK_VK_TO_VSC, 0)

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

class INPUT(ctypes.Structure):
    class _INPUT(ctypes.Union):
        _fields_ = (("ki", KEYBDINPUT),
                    ("mi", MOUSEINPUT),
                    ("hi", HARDWAREINPUT))
    _anonymous_ = ("_input",)
    _fields_ = (("type",   wintypes.DWORD),
                ("_input", _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

# Functions

def PressKey(hexKeyCode):
    x = INPUT(type=INPUT_KEYBOARD,
              ki=KEYBDINPUT(wVk=hexKeyCode))
    user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))

def ReleaseKey(hexKeyCode):
    x = INPUT(type=INPUT_KEYBOARD,
              ki=KEYBDINPUT(wVk=hexKeyCode,
                            dwFlags=KEYEVENTF_KEYUP))
    user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))

def AltTab():
    """Press Alt+Tab and hold Alt key for 2 seconds
    in order to see the overlay.
    """
    PressKey(VK_MENU)   # Alt
    PressKey(VK_TAB)    # Tab
    ReleaseKey(VK_TAB)  # Tab~
    time.sleep(2)
    ReleaseKey(VK_MENU) # Alt~

if __name__ == "__main__":
    AltTab()

hexKeyCode はWindows APIで定義されている仮想キーボードのマッピングです。コードの一覧は MSDN で公開されています。 仮想キーコード (Windows)