命令講座 <onkey命令>

Last Update : 2008/06/xx

onkey命令 (キーボードのキー入力割り込み指定)

 キーボードのキー押し割り込み動作を設定する命令です。HSPのウィンドウがアクティブ状態である時、キー押しが行われた場合に指定したラベルへ強制的にジャンプします。(マウスクリックの場合はonclick命令

 onkey *label

 ジャンプしたラベル先では、HSPのシステム変数のiparam、lparam、wparamに以下の数値が返ってきます。

変数 説明
iparam 押し下げられているキーコード(文字コード)が返ってきます。キーコードは、getkey命令と同じ数値です。方向キー、ファンクションキー(F1〜)、Shiftキー、Ctrlキーなど文字入力関連以外は、0が返ってきます。(参照、HSPWiKi キーコード表
lparam いくつかのキー押し関連情報がビット単位で返ります。
wparam 押し下げられているキーコード(仮想キーコード)が返ってきます。方向キー、ファンクションキー(F1〜、F10除く)、Shiftキー、Ctrlキーなども返ります。キーコードは、getkey命令と同じ数値です。(参照、HSPWiKi キーコード表

 onkey命令の第1パラメータ相当の部分に0を指定することで、割り込み処理を一時的に停止することもできます。逆に1を指定すると再開です。

 onkey 0

^

サンプルコード

 押されたキーをチェックするサンプルスクリプト。wparam値、またはiparam値をチェックします。strf関数の「%c」指定子を利用すれば、押したキーをキャラクタ文字へと変換できます。

	onkey *jump
	stop

*jump
	mes ""+wparam+" "+strf("[%c]", iparam)
//	押したキーのキャラクタ文字表示 (HSP3)

	onkey *jump
	stop

*jump
	pos xvalue

	mes strf("%c", iparam)
	xvalue += ginfo(14)

	stop

 lparam値には、いくつかのキー押し情報がビット単位で返ってきます。たとえば、ビット30には、そのキーが直前に押されている(1)か、離されている(0)か、が返ってきます。(右シフトしてビット30の値をチェック)

;	長押ししても初回のキー押ししか反応しないコード

	onkey *jump
	stop

*jump
	if lparam >> 30 = 0 {
		mes wparam
	}

	stop
;	長押しのみ反応するコード

	onkey *jump
	stop

*jump
	if lparam >> 30 {
		mes wparam
	}

	stop

^

サブルーチンジャンプ [HSP3]

 HSP3では、onkey命令のラベル名指定の前部分に「gosub」を付けることで、サブルーチンジャンプ処理が加わりました。ラベルジャンプ先では、必ず「return」させなければなりません。

 なお、onkey命令のラベル名指定の前部分に「goto」を指定した場合は、普通のジャンプ処理です(省略可)。

 処理の違いが分かるサンプルコードです。どんどん数値をアップする処理をループ中に行っているので、リセットするため何かしらキーボードのキーを押した場合、数値の動きは・・・。

//	サブルーチンジャンプ

	onkey gosub *jump

	repeat
		wait 10
		title ""+count
		count++
	loop

*jump
	count = 0

;	⇒ループ中に戻る
	return
//	通常ジャンプ

	onkey *jump

	repeat
		wait 10
		title ""+count
		count++
	loop

*jump
	count = 0

;	⇒まんまストップ
	stop

^

(参考) F10キー

 onkey命令で唯一取得できないのがファンクションキーの1つ「F10」キーです。F10キーは、Windowsの特殊なシステムキーで、通常このキーを押し下げた場合、プログラムのフォーカスがウィンドウのメニューバー(存在しなくても)に移り、結果として、プログラムの処理が停止することになります。

;	WM_SYSKEYDOWNメッセージ
	oncmd gosub *syskeydown, $104

	stop

*syskeydown
;	F10キー(キーコード121) or Altキー(キーコード18) で反応
	mes wparam
	return

^

Copyright © 2005-2008 HSP情報サイト Let's HSP!. All rights reserved.