Pythonによるキーボードシミュレーションの実装方法

Pythonによるキーボードシミュレーションの実装方法

PYTHON3 チュートリアル

Pythonを使用してキーシミュレーションを行うことは、自動化やテストなど様々な用途で役立ちます。特にWindows環境では、ctypesモジュールを使ってWindows APIのSendInput関数を利用することで、マウスやキーボードの操作をプログラムからシミュレートすることができます。

必要な準備

キーシミュレーションを行うには、まず以下のようにctypesモジュールをインポートします:

import ctypes
import time
import string

LONG = ctypes.c_long
DWORD = ctypes.c_ulong
ULONG_PTR = ctypes.POINTER(DWORD)
WORD = ctypes.c_ushort

class MOUSEINPUT(ctypes.Structure):
    _fields_ = (('dx', LONG),
                ('dy', LONG),
                ('mouseData', DWORD),
                ('dwFlags', DWORD),
                ('time', DWORD),
                ('dwExtraInfo', ULONG_PTR))
                
class KEYBDINPUT(ctypes.Structure):
    _fields_ = (('wVk', WORD),
                ('wScan', WORD),
                ('dwFlags', DWORD),
                ('time', DWORD),
                ('dwExtraInfo', ULONG_PTR))
                
class HARDWAREINPUT(ctypes.Structure):
    _fields_ = (('uMsg', DWORD),
                ('wParamL', WORD),
                ('wParamH', WORD))
                
class _INPUTunion(ctypes.Union):
    _fields_ = (('mi', MOUSEINPUT),
                ('ki', KEYBDINPUT),
                ('hi', HARDWAREINPUT))
                
class INPUT(ctypes.Structure):
    _fields_ = (('type', DWORD),
                ('union', _INPUTunion))

SendInput関数の定義

このSendInput関数は、Pythonから直接Windows APIのSendInput関数を呼び出すためのラッパー関数です。これにより、キーボードやマウスの入力イベントをプログラムからシミュレートすることができます。自動化スクリプトの作成や、ユーザーインターフェースのテストなど、幅広い用途で活用できます。

def SendInput(*inputs):
    nInputs = len(inputs)
    LPINPUT = INPUT * nInputs
    pInputs = LPINPUT(*inputs)
    cbSize = ctypes.c_int(ctypes.sizeof(INPUT))
    return ctypes.windll.user32.SendInput(nInputs, pInputs, cbSize)
  • *inputs: 可変長引数として、複数のINPUT構造体を受け取ります。これにより、一度に複数の入力イベントを送信することができます。
  • 受け取ったinputsの数をnInputsとして取得します。これは、後でSendInput関数に渡すために必要な情報です。
  • LPINPUTは、INPUT構造体の配列タイプを定義します。ここでは、INPUT構造体をnInputs個持つ配列を作成しています。
  • pInputsは、その配列にinputsを展開して格納したものです。これにより、個々の入力イベントが配列として準備されます。
  • cbSizeは、INPUT構造体のサイズをバイト単位で取得し、それをctypes.c_int型でラップしたものです。これもSendInput関数に必要な情報です。
  • 最後に、ctypesを使ってWindows APIのSendInput関数を呼び出します。引数として、入力イベントの数、入力イベントの配列、および各INPUT構造体のサイズを渡します。
  • ctypes.windll.user32.SendInputは、Windowsのuser32.dllからSendInput関数を呼び出すためのものです。

この関数を使えば、例えば以下のようにしてキーボードのキー押下イベントをシミュレートすることが可能です。

SendInput(Keyboard(VK_SPACE))  # スペースキーを押下
SendInput(Keyboard(VK_SPACE, KEYEVENTF_KEYUP))  # スペースキーを解放

定数の定義

1. 入力タイプの定義

以下の定数は、入力イベントの種類を表しています。SendInput関数に渡すことで、どのタイプの入力イベントかを指定します。

この部分では、仮想キーコードやマウスイベントフラグを定義しています。これらの定数を使用して、特定のキーやマウス操作をシミュレートします。

  • INPUT_MOUSE: マウスイベントを示します。
  • INPUT_KEYBOARD: キーボードイベントを示します。
  • INPUT_HARDWARE: ハードウェアイベントを示します。

2. マウスイベントフラグの定義

マウスイベントフラグは、マウスの動作やボタンの状態を表すために使用されます。

  • WHEEL_DELTA: マウスホイールの回転量を示します。
  • XBUTTON1, XBUTTON2: マウスのサイドボタンを示します。
  • MOUSEEVENTF_*: 様々なマウスイベント(移動、クリック、ホイール回転など)を示します。

3. 仮想キーコードの定義

仮想キーコードは、特定のキーを識別するために使用されます。これらのコードを使用して、キーボードイベントをシミュレートします。

  • VK_LBUTTONから始まる各定数は、特定のキーやボタンに対応する仮想キーコードを表しています。
  • 例えば、VK_SPACEはスペースキー、VK_RETURNはエンターキーを表します。

4. キーイベントフラグの定義

キーイベントフラグは、キーボードイベントの動作を制御するために使用されます。

  • KEYEVENTF_EXTENDEDKEY: 拡張キーを示します。
  • KEYEVENTF_KEYUP: キーの解放を示します。
  • KEYEVENTF_SCANCODE: スキャンコードを使用することを示します。
  • KEYEVENTF_UNICODE: Unicodeキャラクタを送信することを示します。
#1.入力タイプの定義
INPUT_MOUSE = 0
INPUT_KEYBOARD = 1
INPUT_HARDWARE = 2

#2.マウスイベントフラグの定義
WHEEL_DELTA = 120
XBUTTON1 = 0x0001
XBUTTON2 = 0x0002
MOUSEEVENTF_ABSOLUTE = 0x8000
MOUSEEVENTF_HWHEEL = 0x01000
MOUSEEVENTF_MOVE = 0x0001
MOUSEEVENTF_MOVE_NOCOALESCE = 0x2000
MOUSEEVENTF_LEFTDOWN = 0x0002
MOUSEEVENTF_LEFTUP = 0x0004
MOUSEEVENTF_RIGHTDOWN = 0x0008
MOUSEEVENTF_RIGHTUP = 0x0010
MOUSEEVENTF_MIDDLEDOWN = 0x0020
MOUSEEVENTF_MIDDLEUP = 0x0040
MOUSEEVENTF_VIRTUALDESK = 0x4000
MOUSEEVENTF_WHEEL = 0x0800
MOUSEEVENTF_XDOWN = 0x0080
MOUSEEVENTF_XUP = 0x0100

#3.仮想キーコードの定義
VK_LBUTTON = 0x01
VK_RBUTTON = 0x02
VK_CANCEL = 0x03
VK_MBUTTON = 0x04
VK_XBUTTON1 = 0x05
VK_XBUTTON2 = 0x06
VK_BACK = 0x08
VK_TAB = 0x09
VK_CLEAR = 0x0C
VK_RETURN = 0x0D
VK_SHIFT = 0x10
VK_CONTROL = 0x11
VK_MENU = 0x12
VK_PAUSE = 0x13
VK_CAPITAL = 0x14
VK_KANA = 0x15
VK_HANGUL = 0x15
VK_JUNJA = 0x17
VK_FINAL = 0x18
VK_HANJA = 0x19
VK_KANJI = 0x19
VK_ESCAPE = 0x1B
VK_CONVERT = 0x1C
VK_NONCONVERT = 0x1D
VK_ACCEPT = 0x1E
VK_MODECHANGE = 0x1F
VK_SPACE = 0x20
VK_PRIOR = 0x21
VK_NEXT = 0x22
VK_END = 0x23
VK_HOME = 0x24
VK_LEFT = 0x25
VK_UP = 0x26
VK_RIGHT = 0x27
VK_DOWN = 0x28
VK_SELECT = 0x29
VK_PRINT = 0x2A
VK_EXECUTE = 0x2B
VK_SNAPSHOT = 0x2C
VK_INSERT = 0x2D
VK_DELETE = 0x2E
VK_HELP = 0x2F
VK_LWIN = 0x5B
VK_RWIN = 0x5C
VK_APPS = 0x5D
VK_SLEEP = 0x5F
VK_NUMPAD0 = 0x60
VK_NUMPAD1 = 0x61
VK_NUMPAD2 = 0x62
VK_NUMPAD3 = 0x63
VK_NUMPAD4 = 0x64
VK_NUMPAD5 = 0x65
VK_NUMPAD6 = 0x66
VK_NUMPAD7 = 0x67
VK_NUMPAD8 = 0x68
VK_NUMPAD9 = 0x69
VK_MULTIPLY = 0x6A
VK_ADD = 0x6B
VK_SEPARATOR = 0x6C
VK_SUBTRACT = 0x6D
VK_DECIMAL = 0x6E
VK_DIVIDE = 0x6F
VK_F1 = 0x70
VK_F2 = 0x71
VK_F3 = 0x72
VK_F4 = 0x73
VK_F5 = 0x74
VK_F6 = 0x75
VK_F7 = 0x76
VK_F8 = 0x77
VK_F9 = 0x78
VK_F10 = 0x79
VK_F11 = 0x7A
VK_F12 = 0x7B
VK_F13 = 0x7C
VK_F14 = 0x7D
VK_F15 = 0x7E
VK_F16 = 0x7F
VK_F17 = 0x80
VK_F18 = 0x81
VK_F19 = 0x82
VK_F20 = 0x83
VK_F21 = 0x84
VK_F22 = 0x85
VK_F23 = 0x86
VK_F24 = 0x87
VK_NUMLOCK = 0x90
VK_SCROLL = 0x91
VK_LSHIFT = 0xA0
VK_RSHIFT = 0xA1
VK_LCONTROL = 0xA2
VK_RCONTROL = 0xA3
VK_LMENU = 0xA4
VK_RMENU = 0xA5
VK_BROWSER_BACK = 0xA6
VK_BROWSER_FORWARD = 0xA7
VK_BROWSER_REFRESH = 0xA8
VK_BROWSER_STOP = 0xA9
VK_BROWSER_SEARCH = 0xAA
VK_BROWSER_FAVORITES = 0xAB
VK_BROWSER_HOME = 0xAC
VK_VOLUME_MUTE = 0xAD
VK_VOLUME_DOWN = 0xAE
VK_VOLUME_UP = 0xAF
VK_MEDIA_NEXT_TRACK = 0xB0
VK_MEDIA_PREV_TRACK = 0xB1
VK_MEDIA_STOP = 0xB2
VK_MEDIA_PLAY_PAUSE = 0xB3
VK_LAUNCH_MAIL = 0xB4
VK_LAUNCH_MEDIA_SELECT = 0xB5
VK_LAUNCH_APP1 = 0xB6
VK_LAUNCH_APP2 = 0xB7
VK_OEM_1 = 0xBA
VK_OEM_PLUS = 0xBB
VK_OEM_COMMA = 0xBC
VK_OEM_MINUS = 0xBD
VK_OEM_PERIOD = 0xBE
VK_OEM_2 = 0xBF
VK_OEM_3 = 0xC0
VK_OEM_4 = 0xDB
VK_OEM_5 = 0xDC
VK_OEM_6 = 0xDD
VK_OEM_7 = 0xDE
VK_OEM_8 = 0xDF
VK_OEM_102 = 0xE2
VK_PROCESSKEY = 0xE5
VK_PACKET = 0xE7
VK_ATTN = 0xF6
VK_CRSEL = 0xF7
VK_EXSEL = 0xF8
VK_EREOF = 0xF9
VK_PLAY = 0xFA
VK_ZOOM = 0xFB
VK_PA1 = 0xFD
VK_OEM_CLEAR = 0xFE

#4.キーイベントフラグの定義
KEYEVENTF_EXTENDEDKEY = 0x0001
KEYEVENTF_KEYUP = 0x0002
KEYEVENTF_SCANCODE = 0x0008
KEYEVENTF_UNICODE = 0x0004

KEY_0 = 0x30
KEY_1 = 0x31
KEY_2 = 0x32
KEY_3 = 0x33
KEY_4 = 0x34
KEY_5 = 0x35
KEY_6 = 0x36
KEY_7 = 0x37
KEY_8 = 0x38
KEY_9 = 0x39
KEY_A = 0x41
KEY_B = 0x42
KEY_C = 0x43
KEY_D = 0x44
KEY_E = 0x45
KEY_F = 0x46
KEY_G = 0x47
KEY_H = 0x48
KEY_I = 0x49
KEY_J = 0x4A
KEY_K = 0x4B
KEY_L = 0x4C
KEY_M = 0x4D
KEY_N = 0x4E
KEY_O = 0x4F
KEY_P = 0x50
KEY_Q = 0x51
KEY_R = 0x52
KEY_S = 0x53
KEY_T = 0x54
KEY_U = 0x55
KEY_V = 0x56
KEY_W = 0x57
KEY_X = 0x58
KEY_Y = 0x59
KEY_Z = 0x5A

これらの定数は、特定のキーやマウス操作をシミュレートする際に、SendInput関数やその他のヘルパー関数とともに使用されます。各定数は、仮想キーコードやイベントフラグに対応しており、シミュレーションしたい操作に応じて適切に選択されます。

入力構造体の生成

この部分では、特定の入力イベント(マウス、キーボード、ハードウェア)を表すための構造体を生成するための関数を定義しています。これらの関数は、SendInput関数に渡すためのINPUT構造体を作成します。

1. Input関数

def Input(structure):
    if isinstance(structure, MOUSEINPUT):
        return INPUT(INPUT_MOUSE, _INPUTunion(mi=structure))
    if isinstance(structure, KEYBDINPUT):
        return INPUT(INPUT_KEYBOARD, _INPUTunion(ki=structure))
    if isinstance(structure, HARDWAREINPUT):
        return INPUT(INPUT_HARDWARE, _INPUTunion(hi=structure))
    raise TypeError('Cannot create INPUT structure!')

この関数は、渡された特定の入力構造体(MOUSEINPUT, KEYBDINPUT, HARDWAREINPUT)に基づいて、対応するINPUT構造体を生成します。

  • structure: MOUSEINPUT, KEYBDINPUT, HARDWAREINPUTのいずれかのインスタンス。

関数の動作:

  1. structureMOUSEINPUTのインスタンスであれば、INPUT構造体をINPUT_MOUSEタイプとして生成し、_INPUTunionmi(マウス入力)を設定します。
  2. structureKEYBDINPUTのインスタンスであれば、INPUT構造体をINPUT_KEYBOARDタイプとして生成し、_INPUTunionki(キーボード入力)を設定します。
  3. structureHARDWAREINPUTのインスタンスであれば、INPUT構造体をINPUT_HARDWAREタイプとして生成し、_INPUTunionhi(ハードウェア入力)を設定します。
  4. それ以外の場合、TypeErrorを発生させます。

2. MouseInput関数

def MouseInput(flags, x, y, data):
    return MOUSEINPUT(x, y, data, flags, 0, None)

この関数は、マウス入力を表すMOUSEINPUT構造体を生成します。

  • flags: マウスイベントの種類(例:移動、クリックなど)。
  • x, y: マウスカーソルの座標。
  • data: マウスホイールの回転量やサイドボタンの状態。

戻り値:

  • MOUSEINPUT構造体のインスタンス。

3. KeybdInput関数

def KeybdInput(code, flags):
    return KEYBDINPUT(code, code, flags, 0, None)

この関数は、キーボード入力を表すKEYBDINPUT構造体を生成します。

  • code: 仮想キーコード。
  • flags: キーイベントフラグ(例:キーの押下、解放など)。

戻り値:

  • KEYBDINPUT構造体のインスタンス。

4. HardwareInput関数

def HardwareInput(message, parameter):
    return HARDWAREINPUT(message & 0xFFFFFFFF,
                         parameter & 0xFFFF,
                         parameter >> 16 & 0xFFFF)

この関数は、ハードウェア入力を表すHARDWAREINPUT構造体を生成します。

  • message: ハードウェアメッセージ。
  • parameter: ハードウェアパラメータ。

戻り値:

  • HARDWAREINPUT構造体のインスタンス。

5. Mouse関数

def Mouse(flags, x=0, y=0, data=0):
    return Input(MouseInput(flags, x, y, data))

この関数は、マウス入力イベントを生成します。

  • flags: マウスイベントの種類。
  • x, y: マウスカーソルの座標。
  • data: マウスホイールの回転量やサイドボタンの状態。

戻り値:

  • INPUT構造体のインスタンス。

6. Keyboard関数

def Keyboard(code, flags=0):
    return Input(KeybdInput(code, flags))

この関数は、キーボード入力イベントを生成します。

  • code: 仮想キーコード。
  • flags: キーイベントフラグ。

戻り値:

  • INPUT構造体のインスタンス。

7. Hardware関数

def Hardware(message, parameter=0):
    return Input(HardwareInput(message, parameter))

この関数は、ハードウェア入力イベントを生成します。

  • message: ハードウェアメッセージ。
  • parameter: ハードウェアパラメータ。

戻り値:

  • INPUT構造体のインスタンス。

これらの関数を使用して、特定の入力イベントを表す構造体を生成し、SendInput関数に渡すことで、マウスやキーボード、ハードウェアの操作をプログラムからシミュレートできます。これにより、自動化やテストのシナリオで効率的に操作を行うことが可能です。

キーボード入力とマウス入力の定義

def MouseInput(flags, x, y, data):
    return MOUSEINPUT(x, y, data, flags, 0, None)

def KeybdInput(code, flags):
    return KEYBDINPUT(code, code, flags, 0, None)

def HardwareInput(message, parameter):
    return HARDWAREINPUT(message & 0xFFFFFFFF,
                         parameter & 0xFFFF,
                         parameter >> 16 & 0xFFFF)

def Mouse(flags, x=0, y=0, data=0):
    return Input(MouseInput(flags, x, y, data))

def Keyboard(code, flags=0):
    return Input(KeybdInput(code, flags))

def Hardware(message, parameter=0):
    return Input(HardwareInput(message, parameter))

この部分では、キーボードおよびマウスの入力イベントを生成するための関数を定義しています。これらの関数は、入力イベントを表す構造体を生成し、SendInput関数に渡すためのINPUT構造体を作成します。

1. MouseInput関数

def MouseInput(flags, x, y, data):
    return MOUSEINPUT(x, y, data, flags, 0, None)

この関数は、マウス入力を表すMOUSEINPUT構造体を生成します。

  • flags: マウスイベントの種類(例:移動、クリックなど)。
  • x, y: マウスカーソルの座標。
  • data: マウスホイールの回転量やサイドボタンの状態。

戻り値:

  • MOUSEINPUT構造体のインスタンス。

2. KeybdInput関数

def KeybdInput(code, flags):
    return KEYBDINPUT(code, code, flags, 0, None)

この関数は、キーボード入力を表すKEYBDINPUT構造体を生成します。

  • code: 仮想キーコード。
  • flags: キーイベントフラグ(例:キーの押下、解放など)。

戻り値:

  • KEYBDINPUT構造体のインスタンス。

3. HardwareInput関数

def HardwareInput(message, parameter):
    return HARDWAREINPUT(message & 0xFFFFFFFF,
                         parameter & 0xFFFF,
                         parameter >> 16 & 0xFFFF)

この関数は、ハードウェア入力を表すHARDWAREINPUT構造体を生成します。

  • message: ハードウェアメッセージ。
  • parameter: ハードウェアパラメータ。

戻り値:

  • HARDWAREINPUT構造体のインスタンス。

4. Mouse関数

def Mouse(flags, x=0, y=0, data=0):
    return Input(MouseInput(flags, x, y, data))

この関数は、マウス入力イベントを生成します。

  • flags: マウスイベントの種類。
  • x, y: マウスカーソルの座標。
  • data: マウスホイールの回転量やサイドボタンの状態。

戻り値:

  • INPUT構造体のインスタンス。

Mouse関数は、MouseInput関数を呼び出してMOUSEINPUT構造体を生成し、それをInput関数に渡してINPUT構造体を生成します。これにより、マウスイベントをシミュレートできます。

5. Keyboard関数

def Keyboard(code, flags=0):
    return Input(KeybdInput(code, flags))

この関数は、キーボード入力イベントを生成します。

  • code: 仮想キーコード。
  • flags: キーイベントフラグ。

戻り値:

  • INPUT構造体のインスタンス。

Keyboard関数は、KeybdInput関数を呼び出してKEYBDINPUT構造体を生成し、それをInput関数に渡してINPUT構造体を生成します。これにより、キーボードイベントをシミュレートできます。

6. Hardware関数

def Hardware(message, parameter=0):
    return Input(HardwareInput(message, parameter))

この関数は、ハードウェア入力イベントを生成します。

  • message: ハードウェアメッセージ。
  • parameter: ハードウェアパラメータ。

戻り値:

  • INPUT構造体のインスタンス。

Hardware関数は、HardwareInput関数を呼び出してHARDWAREINPUT構造体を生成し、それをInput関数に渡してINPUT構造体を生成します。これにより、ハードウェアイベントをシミュレートできます。

これらの関数は、特定の入力イベント(マウス、キーボード、ハードウェア)を表す構造体を生成し、それをSendInput関数に渡すためのINPUT構造体を作成します。これにより、マウスやキーボードの操作をプログラムからシミュレートし、自動化スクリプトやテストシナリオを実行することができます。

キーボードストリームの生成

この部分では、文字列をキーイベントのシーケンスに変換する関数を定義します。各文字に対応するキーコードを取得し、必要に応じてシフトキーを押すなどの操作を行います。

UPPER = frozenset('~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?')
LOWER = frozenset("`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./")
ORDER = string.ascii_letters + string.digits + ' \b\r\t'
ALTER = dict(zip('!@#$%^&*()', '1234567890'))
OTHER = {'`': VK_OEM_3,
         '~': VK_OEM_3,
         '-': VK_OEM_MINUS,
         '_': VK_OEM_MINUS,
         '=': VK_OEM_PLUS,
         '+': VK_OEM_PLUS,
         '[': VK_OEM_4,
         '{': VK_OEM_4,
         ']': VK_OEM_6,
         '}': VK_OEM_6,
         '\\': VK_OEM_5,
         '|': VK_OEM_5,
         ';': VK_OEM_1,
         ':': VK_OEM_1,
         "'": VK_OEM_7,
         '"': VK_OEM_7,
         ',': VK_OEM_COMMA,
         '<': VK_OEM_COMMA,
         '.': VK_OEM_PERIOD,
         '>': VK_OEM_PERIOD,
         '/': VK_OEM_2,
         '?': VK_OEM_2}

def keyboard_stream(string):
    mode = False
    for character in string.replace('\r\n', '\r').replace('\n', '\r'):
        if mode and character in LOWER or not mode and character in UPPER:
            yield Keyboard(VK_SHIFT, mode and KEYEVENTF_KEYUP)
            mode = not mode
        character = ALTER.get(character, character)
        if character in ORDER:
            code = ord(character.upper())
        elif character in OTHER:
            code = OTHER[character]
        else:
            continue
            #Or, to abort on unavailable character
            #raise ValueError('String is not understood!')
        yield Keyboard(code)
        yield Keyboard(code, KEYEVENTF_KEYUP)
    if mode:
        yield Keyboard(VK_SHIFT, KEYEVENTF_KEYUP)

説明

  1. 定数の定義:
    • UPPER: シフトキーが必要な大文字や記号を含む文字セット。
    • LOWER: シフトキーが不要な小文字や数字、記号を含む文字セット。
    • ORDER: 順序付けられた文字列としてのASCII文字と制御文字(スペース、バックスペース、リターン、タブ)。
    • ALTER: 特定の記号を数字に変換する辞書。
    • OTHER: その他のキーコードにマッピングする辞書。
  2. keyboard_stream関数:
    • 入力: 文字列。
    • 出力: キーボード入力イベントのジェネレータ。
  3. モード切替:
    • シフトキーの押下/解放のトグル。modeフラグでシフトキーの状態を管理。
  4. 文字の処理:
    • 文字列を1文字ずつ処理。
    • 特定の条件下でシフトキーを押下/解放。
    • ALTER辞書を使用して記号を数字に変換。
    • ORDERに含まれる文字はASCIIコードを使用してキーコードを取得。
    • OTHER辞書を使用して特定のキーコードを取得。
    • 不明な文字は無視(またはエラーを投げることも可能)。
  5. キー入力イベントの生成:
    • 各文字に対してキー押下イベントとキー解放イベントを生成。
    • シフトキーが必要な場合は押下/解放を行う。

keyboard_stream関数は、与えられた文字列をキーボード入力イベントのシーケンスに変換します。この関数を使用することで、文字列をシミュレートされたキーボード入力として送信することができます。これにより、プログラムからテキスト入力の自動化が可能になります。

メイン関数とユーティリティ関数

def main():
    time.sleep(5)
    for event in keyboard_stream('o2E^uXh#:SHn&HQ+t]YF'):
        SendInput(event)
        time.sleep(0.1)

def switch_program():
    SendInput(Keyboard(VK_MENU), Keyboard(VK_TAB))
    time.sleep(0.2)
    SendInput(Keyboard(VK_TAB, KEYEVENTF_KEYUP),
              Keyboard(VK_MENU, KEYEVENTF_KEYUP))
    time.sleep(0.2)

def select_line():
    SendInput(Keyboard(VK_SHIFT, KEYEVENTF_EXTENDEDKEY),
              Keyboard(VK_END, KEYEVENTF_EXTENDEDKEY))
    time.sleep(0.2)
    SendInput(Keyboard(VK_SHIFT, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP),
              Keyboard(VK_END, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP))
    time.sleep(0.2)

def copy_line():
    SendInput(Keyboard(VK_CONTROL), Keyboard(KEY_C))
    time.sleep(0.2)
    SendInput(Keyboard(VK_CONTROL, KEYEVENTF_KEYUP),
              Keyboard(KEY_C, KEYEVENTF_KEYUP))
    time.sleep(0.2)

def next_line():
    SendInput(Keyboard(VK_HOME), Keyboard(VK_DOWN))
    time.sleep(0.2)
    SendInput(Keyboard(VK_HOME, KEYEVENTF_KEYUP),
              Keyboard(VK_DOWN, KEYEVENTF_KEYUP))
    time.sleep(0.2)

def prepare_text():
    # Open Text
    SendInput(Keyboard(KEY_M))
    time.sleep(0.2)
    SendInput(Keyboard(KEY_M, KEYEVENTF_KEYUP))
    time.sleep(0.2)
    # Goto Area
    SendInput(Keyboard(VK_TAB))
    time.sleep(0.2)
    SendInput(Keyboard(VK_TAB, KEYEVENTF_KEYUP))
    time.sleep(0.2)
    # Paste Message
    SendInput(Keyboard(VK_CONTROL), Keyboard(KEY_V))
    time.sleep(0.2)
    SendInput(Keyboard(VK_CONTROL, KEYEVENTF_KEYUP),
              Keyboard(KEY_V, KEYEVENTF_KEYUP))
    time.sleep(0.2)
    # Goto Button
    SendInput(Keyboard(VK_TAB))
    time.sleep(0.2)
    SendInput(Keyboard(VK_TAB, KEYEVENTF_KEYUP))
    time.sleep(0.2)

def send_one_message():
    select_line()
    copy_line()
    next_line()
    switch_program()
    prepare_text()
    # Send Message
    SendInput(Keyboard(VK_RETURN))
    time.sleep(0.2)
    SendInput(Keyboard(VK_RETURN, KEYEVENTF_KEYUP))
    time.sleep(10)
    switch_program()

def send_messages(total):
    time.sleep(10)
    for _ in range(total):
        send_one_message()

メイン関数

メイン関数は、キーボードストリームを生成し、入力イベントをシミュレートするためのものです。

この関数は、以下の操作を行います:

  1. 5秒間の待機。
  2. keyboard_stream関数を使用して、文字列 'o2E^uXh#:SHn&HQ+t]YF' をキーボード入力イベントに変換。
  3. 各入力イベントを SendInput 関数で送信。
  4. 各イベントの間に0.1秒の待機。

ユーティリティ関数

これらの関数は、特定の操作をシミュレートするために使用されます。

switch_program関数

この関数は、Alt+Tab操作をシミュレートしてプログラムを切り替えます。

操作の流れ:

  1. AltキーとTabキーを押す。
  2. 0.2秒間待機。
  3. TabキーとAltキーを解放。
  4. 0.2秒間待機。
select_line関数

この関数は、Shift+Endキーの組み合わせを使用して行全体を選択します。

操作の流れ:

  1. ShiftキーとEndキーを押す。
  2. 0.2秒間待機。
  3. ShiftキーとEndキーを解放。
  4. 0.2秒間待機。
copy_line関数

この関数は、Ctrl+Cキーの組み合わせを使用して選択した行をコピーします。

操作の流れ:

  1. CtrlキーとCキーを押す。
  2. 0.2秒間待機。
  3. CtrlキーとCキーを解放。
  4. 0.2秒間待機。
next_line関数

この関数は、HomeキーとDownキーの組み合わせを使用して次の行に移動します。

操作の流れ:

  1. HomeキーとDownキーを押す。
  2. 0.2秒間待機。
  3. HomeキーとDownキーを解放。
  4. 0.2秒間待機。
prepare_text関数

この関数は、テキストを準備してメッセージを入力するための一連の操作を行います。

操作の流れ:

  1. テキストを開くためにMキーを押す。
  2. 0.2秒間待機。
  3. Mキーを解放。
  4. 0.2秒間待機。
  5. 領域に移動するためにTabキーを押す。
  6. 0.2秒間待機。
  7. Tabキーを解放。
  8. 0.2秒間待機。
  9. メッセージを貼り付けるためにCtrl+Vキーを押す。
  10. 0.2秒間待機。
  11. CtrlキーとVキーを解放。
  12. 0.2秒間待機。
  13. ボタンに移動するためにTabキーを押す。
  14. 0.2秒間待機。
  15. Tabキーを解放。
  16. 0.2秒間待機。
send_one_message関数

この関数は、一つのメッセージを送信するための一連の操作を行います。

操作の流れ:

  1. 行を選択。
  2. 選択した行をコピー。
  3. 次の行に移動。
  4. プログラムを切り替え。
  5. テキストを準備。
  6. メッセージを送信(Enterキーを押す)。
  7. 0.2秒間待機。
  8. Enterキーを解放。
  9. 10秒間待機。
  10. プログラムを切り替え。
send_messages関数

この関数は、指定された数のメッセージを送信します。

操作の流れ:

  1. 10秒間待機。
  2. 指定された回数(total)だけ send_one_message 関数を呼び出してメッセージを送信。

これらの関数を組み合わせることで、キーボードやマウスの操作をシミュレートし、特定のタスクを自動化することができます。メイン関数は、キーボードストリームを生成して入力イベントを送信する基本的な操作を行い、ユーティリティ関数は特定のシナリオ(プログラムの切り替え、テキストの選択とコピー、メッセージの送信など)に応じた入力操作を実装しています。

結論

この例では、Pythonのctypesモジュールを使用して、Windows APIのSendInput関数を呼び出し、キーボード入力をシミュレートする方法を説明しました。SendInput関数を使って、様々なキーイベントを送信し、特定の文字列の入力やプログラムの切り替えなどの操作を自動化できます。この技術は、自動化スクリプトの作成やソフトウェアのテストに非常に役立ちます。

購読
通知
0 Comments
Inline Feedbacks
View all comments