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のいずれかのインスタンス。
関数の動作:
structureがMOUSEINPUTのインスタンスであれば、INPUT構造体をINPUT_MOUSEタイプとして生成し、_INPUTunionにmi(マウス入力)を設定します。structureがKEYBDINPUTのインスタンスであれば、INPUT構造体をINPUT_KEYBOARDタイプとして生成し、_INPUTunionにki(キーボード入力)を設定します。structureがHARDWAREINPUTのインスタンスであれば、INPUT構造体をINPUT_HARDWAREタイプとして生成し、_INPUTunionにhi(ハードウェア入力)を設定します。- それ以外の場合、
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)
説明
- 定数の定義:
UPPER: シフトキーが必要な大文字や記号を含む文字セット。LOWER: シフトキーが不要な小文字や数字、記号を含む文字セット。ORDER: 順序付けられた文字列としてのASCII文字と制御文字(スペース、バックスペース、リターン、タブ)。ALTER: 特定の記号を数字に変換する辞書。OTHER: その他のキーコードにマッピングする辞書。
keyboard_stream関数:- 入力: 文字列。
- 出力: キーボード入力イベントのジェネレータ。
- モード切替:
- シフトキーの押下/解放のトグル。
modeフラグでシフトキーの状態を管理。
- シフトキーの押下/解放のトグル。
- 文字の処理:
- 文字列を1文字ずつ処理。
- 特定の条件下でシフトキーを押下/解放。
ALTER辞書を使用して記号を数字に変換。ORDERに含まれる文字はASCIIコードを使用してキーコードを取得。OTHER辞書を使用して特定のキーコードを取得。- 不明な文字は無視(またはエラーを投げることも可能)。
- キー入力イベントの生成:
- 各文字に対してキー押下イベントとキー解放イベントを生成。
- シフトキーが必要な場合は押下/解放を行う。
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()
メイン関数
メイン関数は、キーボードストリームを生成し、入力イベントをシミュレートするためのものです。
この関数は、以下の操作を行います:
- 5秒間の待機。
keyboard_stream関数を使用して、文字列'o2E^uXh#:SHn&HQ+t]YF'をキーボード入力イベントに変換。- 各入力イベントを
SendInput関数で送信。 - 各イベントの間に0.1秒の待機。
ユーティリティ関数
これらの関数は、特定の操作をシミュレートするために使用されます。
switch_program関数
この関数は、Alt+Tab操作をシミュレートしてプログラムを切り替えます。
操作の流れ:
- AltキーとTabキーを押す。
- 0.2秒間待機。
- TabキーとAltキーを解放。
- 0.2秒間待機。
select_line関数
この関数は、Shift+Endキーの組み合わせを使用して行全体を選択します。
操作の流れ:
- ShiftキーとEndキーを押す。
- 0.2秒間待機。
- ShiftキーとEndキーを解放。
- 0.2秒間待機。
copy_line関数
この関数は、Ctrl+Cキーの組み合わせを使用して選択した行をコピーします。
操作の流れ:
- CtrlキーとCキーを押す。
- 0.2秒間待機。
- CtrlキーとCキーを解放。
- 0.2秒間待機。
next_line関数
この関数は、HomeキーとDownキーの組み合わせを使用して次の行に移動します。
操作の流れ:
- HomeキーとDownキーを押す。
- 0.2秒間待機。
- HomeキーとDownキーを解放。
- 0.2秒間待機。
prepare_text関数
この関数は、テキストを準備してメッセージを入力するための一連の操作を行います。
操作の流れ:
- テキストを開くためにMキーを押す。
- 0.2秒間待機。
- Mキーを解放。
- 0.2秒間待機。
- 領域に移動するためにTabキーを押す。
- 0.2秒間待機。
- Tabキーを解放。
- 0.2秒間待機。
- メッセージを貼り付けるためにCtrl+Vキーを押す。
- 0.2秒間待機。
- CtrlキーとVキーを解放。
- 0.2秒間待機。
- ボタンに移動するためにTabキーを押す。
- 0.2秒間待機。
- Tabキーを解放。
- 0.2秒間待機。
send_one_message関数
この関数は、一つのメッセージを送信するための一連の操作を行います。
操作の流れ:
- 行を選択。
- 選択した行をコピー。
- 次の行に移動。
- プログラムを切り替え。
- テキストを準備。
- メッセージを送信(Enterキーを押す)。
- 0.2秒間待機。
- Enterキーを解放。
- 10秒間待機。
- プログラムを切り替え。
send_messages関数
この関数は、指定された数のメッセージを送信します。
操作の流れ:
- 10秒間待機。
- 指定された回数(
total)だけsend_one_message関数を呼び出してメッセージを送信。
これらの関数を組み合わせることで、キーボードやマウスの操作をシミュレートし、特定のタスクを自動化することができます。メイン関数は、キーボードストリームを生成して入力イベントを送信する基本的な操作を行い、ユーティリティ関数は特定のシナリオ(プログラムの切り替え、テキストの選択とコピー、メッセージの送信など)に応じた入力操作を実装しています。
結論
この例では、Pythonのctypesモジュールを使用して、Windows APIのSendInput関数を呼び出し、キーボード入力をシミュレートする方法を説明しました。SendInput関数を使って、様々なキーイベントを送信し、特定の文字列の入力やプログラムの切り替えなどの操作を自動化できます。この技術は、自動化スクリプトの作成やソフトウェアのテストに非常に役立ちます。
