|
|
キーを自動的に送信1 (要USER32.DLL)
|
|
「キーボード内のどのキーが押されたか」は、stick命令やgetkey命令、onkey命令で取得出来ますが、
逆の「キーボード内のいずれかのキーを押す」命令はHSPの標準命令に用意されていませんので、
当ページでは従来のやり方であるAPI関数内のkeybd_event関数を使って行います。
ただ、この関数は少々古く、ウィンドウズ2000頃からはSendInput関数の利用が推奨されていますので、
最近の新しいOSではコチラのやり方を行いましょう。
| VOID keybd_event { |
| BYTE | bVK, | // 仮想キーコード |
| BYTE | bScan, | // ハードウェアスキャンコード |
| DWORD | dwFlags, | // 関数のオプション |
| ULONG_PTR | dwExtraInfo | // 追加のキーストロークデータ |
| }; | | |
keybd_eventの第1引数に指定する仮想キーは以下のコードを使用します。
| 定数 | コード | キー内容 |
| 16進 | 10進 |
| VK_LBUTTON | 0x01 | 1 | マウス左ボタン |
| VK_RBUTTON | 0x02 | 2 | マウス右ボタン |
| VK_CANCEL | 0x03 | 3 | [Cancel] |
| VK_MBUTTON | 0x04 | 4 | マウス中央ボタン |
| VK_BACK | 0x08 | 8 | [Back space] |
| VK_TAB | 0x09 | 9 | [Tab] |
| VK_CLEAR | 0x0C | 12 | [Clear] |
| VK_RETURN | 0x0D | 13 | [Enter] |
| VK_SHIFT | 0x10 | 16 | [Shift] |
| VK_CONTROL | 0x11 | 17 | [Ctrl] |
| VK_MENU | 0x12 | 18 | [Alt] |
| VK_PAUSE | 0x13 | 19 | [Pause] |
| VK_CAPITAL | 0x14 | 20 | [Caps Lock] |
| VK_KANA | 0x15 | 21 | IMEカナモード |
| VK_KANJI | 0x19 | 25 | IME漢字モード |
| VK_ESCAPE | 0x1B | 27 | [Esc] |
| VK_CONVERT | 0x1C | 28 | IME変換 |
| VK_NONCONVERT | 0x1D | 29 | IME無変換 |
| VK_MODECHANGE | 0x1F | 31 | IMEモード変更 |
| VK_SPACE | 0x20 | 32 | スペースキー |
| VK_PRIOR | 0x21 | 33 | [Page Up] |
| VK_NEXT | 0x22 | 34 | [Page Down] |
| VK_END | 0x23 | 35 | [End] |
| VK_HOME | 0x24 | 36 | [Home] |
| VK_LEFT | 0x25 | 37 | [←] |
| VK_UP | 0x26 | 38 | [↑] |
| VK_RIGHT | 0x27 | 39 | [→] |
| VK_DOWN | 0x28 | 40 | [↓] |
| VK_SELECT | 0x29 | 41 | [Select] |
| VK_PRINT | 0x2A | 42 | [Print] |
| VK_EXECUTE | 0x2B | 43 | [Execute] |
| VK_SNAPSHOT | 0x2C | 44 | [Print Screen] |
| VK_INSERT | 0x2D | 45 | [Insert] |
| VK_DELETE | 0x2E | 46 | [Delete] |
| VK_HELP | 0x2F | 47 | [Help] |
| VK_0 | 0x30 | 48 | [0] |
| VK_1 | 0x31 | 49 | [1] |
| VK_2 | 0x32 | 50 | [2] |
| VK_3 | 0x33 | 51 | [3] |
| VK_4 | 0x34 | 52 | [4] |
| VK_5 | 0x35 | 53 | [5] |
| VK_6 | 0x36 | 54 | [6] |
| VK_7 | 0x37 | 55 | [7] |
| VK_8 | 0x38 | 56 | [8] |
| VK_9 | 0x39 | 57 | [9] |
| VK_A | 0x41 | 65 | [A] |
| VK_B | 0x42 | 66 | [B] |
| VK_C | 0x43 | 67 | [C] |
| VK_D | 0x44 | 68 | [D] |
| VK_E | 0x45 | 69 | [E] |
| VK_F | 0x46 | 70 | [F] |
| VK_G | 0x47 | 71 | [G] |
| VK_H | 0x48 | 72 | [H] |
| VK_I | 0x49 | 73 | [I] |
| VK_J | 0x4A | 74 | [J] |
| VK_K | 0x4B | 75 | [K] |
| VK_L | 0x4C | 76 | [L] |
| VK_M | 0x4D | 77 | [M] |
| VK_N | 0x4E | 78 | [N] |
| VK_O | 0x4F | 79 | [O] |
| VK_P | 0x50 | 80 | [P] |
| VK_Q | 0x51 | 81 | [Q] |
| VK_R | 0x52 | 82 | [R] |
| VK_S | 0x53 | 83 | [S] |
| VK_T | 0x45 | 84 | [T] |
| VK_U | 0x55 | 85 | [U] |
| VK_V | 0x56 | 86 | [V] |
| VK_W | 0x57 | 87 | [W] |
| VK_X | 0x58 | 88 | [X] |
| VK_Y | 0x59 | 89 | [Y] |
| VK_Z | 0x5A | 90 | [Z] |
| VK_LWIN | 0x5B | 91 | 左ウィンドウズ [ÿ] |
| VK_RWIN | 0x5C | 92 | 右ウィンドウズ [ÿ] |
| VK_APPS | 0x5D | 93 | アプリケーション |
| VK_SLEEP | 0x5F | 95 | [Sleep] |
| VK_NUMPAD0 | 0x60 | 96 | テンキー [0] |
| VK_NUMPAD1 | 0x61 | 97 | テンキー [1] |
| VK_NUMPAD2 | 0x62 | 98 | テンキー [2] |
| VK_NUMPAD3 | 0x63 | 99 | テンキー [3] |
| VK_NUMPAD4 | 0x64 | 100 | テンキー [4] |
| VK_NUMPAD5 | 0x65 | 101 | テンキー [5] |
| VK_NUMPAD6 | 0x66 | 102 | テンキー [6] |
| VK_NUMPAD7 | 0x67 | 103 | テンキー [7] |
| VK_NUMPAD8 | 0x68 | 104 | テンキー [8] |
| VK_NUMPAD9 | 0x69 | 105 | テンキー [9] |
| VK_MULTIPLY | 0x6A | 106 | テンキー [*] |
| VK_ADD | 0x6B | 107 | テンキー [+] |
| VK_SEPARATOR | 0x6C | 108 | テンキー [Enter] |
| VK_SUBTRACT | 0x6D | 109 | テンキー [-] |
| VK_DECIMAL | 0x6E | 110 | テンキー [.] |
| VK_DIVIDE | 0x6F | 111 | テンキー [/] |
| VK_F1 | 0x70 | 112 | [F1] |
| VK_F2 | 0x71 | 113 | [F2] |
| VK_F3 | 0x72 | 114 | [F3] |
| VK_F4 | 0x73 | 115 | [F4] |
| VK_F5 | 0x74 | 116 | [F5] |
| VK_F6 | 0x75 | 117 | [F6] |
| VK_F7 | 0x76 | 118 | [F7] |
| VK_F8 | 0x77 | 119 | [F8] |
| VK_F9 | 0x78 | 120 | [F9] |
| VK_F10 | 0x79 | 121 | [F10] |
| VK_F11 | 0x7A | 122 | [F11] |
| VK_F12 | 0x7B | 123 | [F12] |
| VK_F13 | 0x7C | 124 | [F13] |
| VK_F14 | 0x7D | 125 | [F14] |
| VK_F15 | 0x7E | 126 | [F15] |
| VK_F16 | 0x7F | 127 | [F16] |
| VK_F17 | 0x80 | 128 | [F17] |
| VK_F18 | 0x81 | 129 | [F18] |
| VK_F19 | 0x82 | 130 | [F19] |
| VK_F20 | 0x83 | 131 | [F20] |
| VK_F21 | 0x84 | 132 | [F21] |
| VK_F22 | 0x85 | 133 | [F22] |
| VK_F23 | 0x86 | 134 | [F23] |
| VK_F24 | 0x87 | 135 | [F24] |
| VK_NUMLOCK | 0x90 | 144 | [Num Lock] |
| VK_SCROLL | 0x91 | 145 | [Scroll Lock] |
|
| 定数 | コード | キー内容 |
| 16進 | 10進 |
| VK_XBUTTON1 | 0x05 | 5 | マウスX1ボタン |
| VK_XBUTTON2 | 0x06 | 6 | マウスX2ボタン |
| VK_BROWSER_BACK | 0xA6 | 166 | ブラウザー [戻る] |
| VK_BROWSER_FORWARD | 0xA7 | 167 | ブラウザー [次へ] |
| VK_BROWSER_REFRESH | 0xA8 | 168 | ブラウザー [更新] |
| VK_BROWSER_STOP | 0xA9 | 169 | ブラウザー [中止] |
| VK_BROWSER_SEARCH | 0xAA | 170 | ブラウザー [検索] |
| VK_BROWSER_FAVORITES | 0xAB | 171 | ブラウザー [お気に入り] |
| VK_BROWSER_HOME | 0xAC | 172 | ブラウザー [ホーム] |
| VK_VOLUME_MUTE | 0xAD | 173 | ボリューム [ミュート] |
| VK_VOLUME_DOWN | 0xAE | 174 | ボリューム [ダウン] |
| VK_VOLUME_UP | 0xAF | 175 | ボリューム [アップ] |
| VK_MEDIA_NEXT_TRACK | 0xB0 | 176 | メディア [次のトラック] |
| VK_MEDIA_PREV_TRACK | 0xB1 | 177 | メディア [前のトラック] |
| VK_MEDIA_STOP | 0xB2 | 178 | メディア [停止] |
| VK_MEDIA_PLAY_PAUSE | 0xB3 | 179 | メディア [開始・停止] |
| VK_LAUNCH_MAIL | 0xB4 | 180 | [メール開始] |
| VK_LAUNCH_MEDIA_SELECT | 0xB5 | 181 | [メディア選択] |
| VK_LAUNCH_APP1 | 0xB6 | 182 | [アプリケーション1起動] |
| VK_LAUNCH_APP2 | 0xB7 | 183 | [アプリケーション2起動] |
※上記一覧はウィンドウズ2000以降で有効
|
|---|
ハードウェアスキャンコードは未使用と解説されながらも、使用されてる良くわからないもの。
具体的には第3引数の関数オプションにKEYEVENTF_EXTENDEDKEY(=0x01)を設定すると、
第1引数の仮想キーコードは使用されず、第2引数のスキャンコードにプリフィクスバイトが付加されます。
KEYEVENTF_EXTENDEDKEYは拡張キーを使用するオプションであり、
[右Ctrl] [右Alt] [右Shift] [Insert] [Delete] [Home] [End] [Page Up] [Page Down]
[カーソルキー] [Num Lock] [Break] [Print Screen] [テンキー/] [テンキーEnter]
昔のキーボードにはコレらのキーが搭載されていなかった為に拡張キーとして用意されたのだとか。
オプションにはKEYEVENTF_KEYUP(=0x02)もあり、押下済キーを離す場合に指定します。
KEYEVENTF_KEYUP(=0x02)を指定しないときはキーの押し下げを意味しており、
KEYEVENTF_EXTENDEDKEY(=0x01)とOR結合しましょう。
| 定数 | コード | キー内容 |
| KEYEVENTF_EXTENDEDKEY | 0x01 | 仮想キーを使わず拡張キーを使用 |
| KEYEVENTF_KEYUP | 0x02 | キーの押し下げを解除 |
第4引数に設定する32ビットキーストロークデータ値の受け取りは別のAPI関数を使用します。
通常使用するには0を指定しておいて問題ありませんのでココでは紹介しません。
サンプルではメモ帳を起動し、「ultimate」と打ち込んでいくものになります。
キーコードの大体はgetkey命令に指定する値と同じものになっており、
数字やアルファベットはASCIIコードと同じコードが使用されている為、下記のように書けます。
キーを「押す」「離す」処理はそれぞれ別々になるわけですが、
[Ctrl]や[Shift]、[Alt]と言った補助キーと一緒に押す場合以外は、通常単一で使用しますので、
サンプルでは「押してから離す」までを基本として、「押し続け」はオプションにしました。
「押し続け」オプションを使う場合は必ず「離す」処理を別途書くようにしてください。
適用範囲はHSPだけに留まらず、HSPが終了してもキー押し続け状態は継続されたままになります。
まぁ…再度、キーボード内の押し続けキーを押せば解除させることはできますが。
|
 |
| setkey コード, 状態 |
| | | |
| コード | 制御する仮想キーコードを指定する。 |
| 状態 | 制御内容(0:押して離す, 1:押し続け, 2:離す)を指定する。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
ll_libload user, "user32.dll"
ll_getproc keybd_event, "keybd_event", user
#module
#deffunc setkey int, int
mref code, 0 : mref continuation, 1
prm = code, 0, 0x02, 0
if continuation ! 2 : ll_callfunc prm, 1, keybd_event@
if continuation ! 1 : ll_callfunc prm, 3, keybd_event@
return
#global
exec "notepad"
keys = 'U', 'L', 'T', 'I', 'M', 'A', 'T', 'E'
repeat 8
setkey keys.cnt
wait 30
loop
|
|
 |
| setkey コード, 状態 |
| | | |
| コード | 制御する仮想キーコードを指定する。 |
| 状態 | 制御内容(0:押して離す, 1:押し続け, 2:離す)を指定する。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#uselib "user32.dll"
#func global keybd_event "keybd_event" int, int, int, int
#module
#deffunc setkey int code, int continuation
if continuation ! 2 : keybd_event code
if continuation ! 1 : keybd_event code, , 0x02
return
#global
exec "notepad"
keys = 'U', 'L', 'T', 'I', 'M', 'A', 'T', 'E'
setkey 16, 1 // Shiftキー押し続け(以下全てのアルファベット大文字化(デフォルトが小文字の場合))
foreach keys
setkey keys.cnt
wait 30
loop
setkey 16, 2 // Shiftキー解除(コレがないと終了しても大文字化されたままになる)
end
|
|