〜 インプット 〜
キーを自動的に送信1 (要USER32.DLL)

「キーボード内のどのキーが押されたか」は、stick命令やgetkey命令、onkey命令で取得出来ますが、
逆の「キーボード内のいずれかのキーを押す」命令はHSPの標準命令に用意されていませんので、
当ページでは従来のやり方であるAPI関数内のkeybd_event関数を使って行います。
ただ、この関数は少々古く、ウィンドウズ2000頃からはSendInput関数の利用が推奨されていますので、
最近の新しいOSではコチラのやり方を行いましょう。
VOID keybd_event {
BYTEbVK,// 仮想キーコード
BYTEbScan,// ハードウェアスキャンコード
DWORDdwFlags,// 関数のオプション
ULONG_PTRdwExtraInfo// 追加のキーストロークデータ
};
keybd_eventの第1引数に指定する仮想キーは以下のコードを使用します。
定数コードキー内容
16進10進
VK_LBUTTON0x011マウス左ボタン
VK_RBUTTON0x022マウス右ボタン
VK_CANCEL0x033[Cancel]
VK_MBUTTON0x044マウス中央ボタン
VK_BACK0x088[Back space]
VK_TAB0x099[Tab]
VK_CLEAR0x0C12[Clear]
VK_RETURN0x0D13[Enter]
VK_SHIFT0x1016[Shift]
VK_CONTROL0x1117[Ctrl]
VK_MENU0x1218[Alt]
VK_PAUSE0x1319[Pause]
VK_CAPITAL0x1420[Caps Lock]
VK_KANA0x1521IMEカナモード
VK_KANJI0x1925IME漢字モード
VK_ESCAPE0x1B27[Esc]
VK_CONVERT0x1C28IME変換
VK_NONCONVERT0x1D29IME無変換
VK_MODECHANGE0x1F31IMEモード変更
VK_SPACE0x2032スペースキー
VK_PRIOR0x2133[Page Up]
VK_NEXT0x2234[Page Down]
VK_END0x2335[End]
VK_HOME0x2436[Home]
VK_LEFT0x2537[←]
VK_UP0x2638[↑]
VK_RIGHT0x2739[→]
VK_DOWN0x2840[↓]
VK_SELECT0x2941[Select]
VK_PRINT0x2A42[Print]
VK_EXECUTE0x2B43[Execute]
VK_SNAPSHOT0x2C44[Print Screen]
VK_INSERT0x2D45[Insert]
VK_DELETE0x2E46[Delete]
VK_HELP0x2F47[Help]
VK_00x3048[0]
VK_10x3149[1]
VK_20x3250[2]
VK_30x3351[3]
VK_40x3452[4]
VK_50x3553[5]
VK_60x3654[6]
VK_70x3755[7]
VK_80x3856[8]
VK_90x3957[9]
VK_A0x4165[A]
VK_B0x4266[B]
VK_C0x4367[C]
VK_D0x4468[D]
VK_E0x4569[E]
VK_F0x4670[F]
VK_G0x4771[G]
VK_H0x4872[H]
VK_I0x4973[I]
VK_J0x4A74[J]
VK_K0x4B75[K]
VK_L0x4C76[L]
VK_M0x4D77[M]
VK_N0x4E78[N]
VK_O0x4F79[O]
VK_P0x5080[P]
VK_Q0x5181[Q]
VK_R0x5282[R]
VK_S0x5383[S]
VK_T0x4584[T]
VK_U0x5585[U]
VK_V0x5686[V]
VK_W0x5787[W]
VK_X0x5888[X]
VK_Y0x5989[Y]
VK_Z0x5A90[Z]
VK_LWIN0x5B91左ウィンドウズ [ÿ]
VK_RWIN0x5C92右ウィンドウズ [ÿ]
VK_APPS0x5D93アプリケーション
VK_SLEEP0x5F95[Sleep]
VK_NUMPAD00x6096テンキー [0]
VK_NUMPAD10x6197テンキー [1]
VK_NUMPAD20x6298テンキー [2]
VK_NUMPAD30x6399テンキー [3]
VK_NUMPAD40x64100テンキー [4]
VK_NUMPAD50x65101テンキー [5]
VK_NUMPAD60x66102テンキー [6]
VK_NUMPAD70x67103テンキー [7]
VK_NUMPAD80x68104テンキー [8]
VK_NUMPAD90x69105テンキー [9]
VK_MULTIPLY0x6A106テンキー [*]
VK_ADD0x6B107テンキー [+]
VK_SEPARATOR0x6C108テンキー [Enter]
VK_SUBTRACT0x6D109テンキー [-]
VK_DECIMAL0x6E110テンキー [.]
VK_DIVIDE0x6F111テンキー [/]
VK_F10x70112[F1]
VK_F20x71113[F2]
VK_F30x72114[F3]
VK_F40x73115[F4]
VK_F50x74116[F5]
VK_F60x75117[F6]
VK_F70x76118[F7]
VK_F80x77119[F8]
VK_F90x78120[F9]
VK_F100x79121[F10]
VK_F110x7A122[F11]
VK_F120x7B123[F12]
VK_F130x7C124[F13]
VK_F140x7D125[F14]
VK_F150x7E126[F15]
VK_F160x7F127[F16]
VK_F170x80128[F17]
VK_F180x81129[F18]
VK_F190x82130[F19]
VK_F200x83131[F20]
VK_F210x84132[F21]
VK_F220x85133[F22]
VK_F230x86134[F23]
VK_F240x87135[F24]
VK_NUMLOCK0x90144[Num Lock]
VK_SCROLL0x91145[Scroll Lock]
定数コードキー内容
16進10進
VK_XBUTTON10x055マウスX1ボタン
VK_XBUTTON20x066マウスX2ボタン
VK_BROWSER_BACK0xA6166ブラウザー [戻る]
VK_BROWSER_FORWARD0xA7167ブラウザー [次へ]
VK_BROWSER_REFRESH0xA8168ブラウザー [更新]
VK_BROWSER_STOP0xA9169ブラウザー [中止]
VK_BROWSER_SEARCH0xAA170ブラウザー [検索]
VK_BROWSER_FAVORITES0xAB171ブラウザー [お気に入り]
VK_BROWSER_HOME0xAC172ブラウザー [ホーム]
VK_VOLUME_MUTE0xAD173ボリューム [ミュート]
VK_VOLUME_DOWN0xAE174ボリューム [ダウン]
VK_VOLUME_UP0xAF175ボリューム [アップ]
VK_MEDIA_NEXT_TRACK0xB0176メディア [次のトラック]
VK_MEDIA_PREV_TRACK0xB1177メディア [前のトラック]
VK_MEDIA_STOP0xB2178メディア [停止]
VK_MEDIA_PLAY_PAUSE0xB3179メディア [開始・停止]
VK_LAUNCH_MAIL0xB4180[メール開始]
VK_LAUNCH_MEDIA_SELECT0xB5181[メディア選択]
VK_LAUNCH_APP10xB6182[アプリケーション1起動]
VK_LAUNCH_APP20xB7183[アプリケーション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_EXTENDEDKEY0x01仮想キーを使わず拡張キーを使用
KEYEVENTF_KEYUP0x02キーの押し下げを解除
第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