Last Update : 2008/06/xx
キーボードのキー押し割り込み動作を設定する命令です。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, 0 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では、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
onkey命令で唯一取得できないのがファンクションキーの1つ「F10」キーです。F10キーは、Windowsの特殊なシステムキーで、通常このキーを押し下げた場合、プログラムのフォーカスがウィンドウのメニューバー(存在しなくても)に移り、結果として、プログラムの処理が停止することになります。
; WM_SYSKEYDOWNメッセージ oncmd gosub *syskeydown, $104 stop *syskeydown ; F10キー(キーコード121) or Altキー(キーコード18) で反応 mes wparam return