イベント
この章まで「待機状態から何らかの処理を実行する」イベント処理は、
ループで変数の状態を監視させて変化があった時に処理させるか、
button命令により配置したボタンを押下した時のいずれかでのみ実行させることができました。
この他に「●●された(またはされようとしている)」状態を「開始キー」として設定しておき、
感知すれば自動的に指定したラベルへジャンプさせることが可能です。

まずは、マウスクリックされた時に何らかの処理を起こしたい場合の命令から説明します。
stick命令の紹介で、クリックをイベントとして押された回数を取得するサンプルを載せましたが、
あくまでクリック値が変数に値がセットされ、押されたかをループで常時監視しているだけの話。
今回は、他のどんな処理をやってる最中(ただしウェイト等の待機状態であることが条件)でも、
監視せずとも押されたら、ソレをイベントとして特定のラベル位置に強制移動させるというものです。
onclick goto/gosub ラベル
goto/gosubジャンプの方法。ジャンプ後にreturnで戻るか戻らないかの設定。
ラベルジャンプ先のラベル(アスタリスクから書くこと!)。
先の説明の通り、クリックされたら、指定ラベルに処理を移します。 HSP2では常に一方通行でジャンプ前の処理位置から再開することはできませんでしたが、 HSP3からgosubリターンでジャンプ前の位置に戻すこともできます。 パラメータにgotogosubかを指定できるようになったわけですが、 指定しない場合はHSP2との互換性の関係でgotoジャンプを行います。 尚、クリックは左ボタンだけでなく、右や真ん中のホイールボタンも押されたうちに入り、 どのボタンが押されたかはシステム変数iparamにセットされます。 左なら0、右なら3、真ん中なら6がセットされるところまではわかってますが、 それ以上にボタンのあるマウスだと、それ以外も取得できるか、取得値はいくらか等の詳細は不明。
 1
 2
 3
 4
 5
 6
 7
	btn = "左", "右", "中"
	onclick gosub *click
	stop

*click
	mes btn(iparam / 3) + "ボタンが押されました"
	return
同様にwparamにも押されたボタンによって値がセットされ、左なら1、右なら2、真ん中なら16、 更にShiftキーも同時押しなら+4、Ctrlキーも同時押しなら+8されます。 マウスボタン同時押しでも、押したボタンの数分指定ラベルにジャンプします。 3つ同時押しなら3回ジャンプするというわけですが、iparamwparamのセットのされ方には差があり、 iparamには今回のジャンプするキッカケになったボタンの値のみがセットされ、 wparamには今回ジャンプした時に押されていたボタンの合計値がセットされるようになっているので、 iparamを見ることで、どのボタンが押されて飛んできたのか知ることができ、 wparamを見ることで、1から最大のShiftとCtrlとマウス左中右ボタン全押で31まで認知できます。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
	btn = "左", "右", "Shift", "Ctrl", "中"
	onclick gosub *click
	stop

*click
	msg = ""
	chk = 1
	foreach btn
		if wparam & chk : msg += strf("[%s]", btn.cnt)
		chk <<= 1
	loop
	mes msg + "ボタンが押されています"
	return
システム変数lparamにはクリック時の座標が合わせてセットされます。 X座標はlparamの下位2バイト、Y座標はlparamの上位2バイトとなりますので、 取り出しは「x = lparam & 0xFFFF」「y = lparam >> 16」としましょう。 まぁこんな取り方しなくても、システム変数musexとmouseyと同じなんで、そこから取ればいいんですが。
 1
 2
 3
 4
 5
 6
 7
	onclick gosub *click
	stop

*click
	mes strf("lparamの座標(%d, %d)", lparam & 0xFFFF, lparam >> 16)
	mes strf("システム変数(%d, %d)", mousex, mousey)
	return
1度onclick命令で設定したら終了するまで継続させることができますが、 逆に途中でクリックされてもジャンプさせないようにすることも当然できます。 onclick命令設定後にクリックされてもジャンプしないようにするには「onclick 0」を、 ジャンプ中止後に再度クリックされたときにジャンプするように設定するには「onclick 1」としてください。 ジャンプ先ラベルは1つしか設定できませんが、 行う処理毎にジャンプ先を変更したい場合、処理毎にonclick命令でジャンプ先を変更してあげましょう。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
	onclick gosub *click
	button gosub "監視切替", *change
	stop

*click
	mes "現在監視中!"
	return

*change
	onclick chk
	chk = 1 - chk
	return
続いて、キーボード内のいずれかのキー押下をイベントとしてジャンプさせる命令を紹介します。
onkey goto/gosub ラベル
goto/gosubジャンプの方法。ジャンプ後にreturnで戻るか戻らないかの設定。
ラベルジャンプ先のラベル(アスタリスクから書くこと!)。
この命令もHSP2では常に一方通行でジャンプ前の処理位置から再開することはできませんでしたが、 HSP3からgosubリターンでジャンプ前の位置に戻すこともできます。 パラメータにgotogosubかを指定できるようになったわけですが、 指定しない場合はHSP2との互換性の関係でgotoジャンプを行います。 また、onclick命令同様に一時的にキーボード内のキーを押されてもジャンプしないようにするには、 「onkey 0」を、ジャンプを再開するには「onkey 1」を指定してください。 システム変数iparamには、文字キーが押された時だけ1がセットされ、 シフトキーやらタブキーやら、その他の制御キーが押された時には0がセットされる様になっています。 システム変数wparamには、getkey命令のキーコード同様の仮想キーコードがセットされます。 システム変数lparamにもセットされますが、幾つか複数の情報が入っている様で詳細はわかりませんが 下位8ビット(16ビット?)はキー毎に異なってるコード、 17〜29ビットにもキー毎に異なってるコードが入っているようですがよくわかりません。 30ビット目には、押し続けている場合のみ1が、そうでないなら0がセットされる様になっています。 押し続ける時間はキーボードのプロパティ「表示までの待ち時間」で設定した分と同じだけとなっています。 レジストリで言う所の「HKEY_CURRENT_USER\Control Panel\Keyboard」キーの「KeyboardDelay」ですね。 見たところ、31、32ビットには何も入らないようです。
 1
 2
 3
 4
 5
 6
 7
 8
	onkey gosub *pushkey
	mes "制御キー無視、押し続け無効"
	stop

*pushkey
	if (lparam >> 30 & 1) ! 0 : return // 「if lparam >> 30」と同じ
	if iparam : mes strf("%c", iparam)
	return
続いては、HSPウィンドウ終了イベントを検知する命令を紹介します。
onexit goto/gosub ラベル
goto/gosubジャンプの方法。ジャンプ後にreturnで戻るか戻らないかの設定。
ラベルジャンプ先のラベル(アスタリスクから書くこと!)。
終了イベントは、当然「終了前」です。終了してから「既に終了しました」では意味がありませんから。 終了直前に「このまま終了してもいいの?」的な意味合いで利用者に確認を取ったり、 終了する前のウィンドウ位置やサイズなどのデータを自動で保存する時などに使える機能です。 この命令もHSP2では常に一方通行でジャンプ前の処理位置から再開することはできませんでしたが、 HSP3からgosubリターンでジャンプ前の位置に戻せるようになりました。 パラメータにgotogosubかを指定できるようになったわけですが、 指定しない場合はHSP2との互換性の関係でgotoジャンプを行います。 また、onclick命令、onkey命令同様に一時的にジャンプしないようにするには、 「onexit 0」を、ジャンプを再開するには「onexit 1」を指定してください。 尚、onexit命令による終了イベントを受け付けている時は end命令で終了できるようにしておかなければ、終了できなくなってしまうので気をつけてください。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
	onexit gosub *exit
	notesel s
	mesbox s, ginfo_winx, ginfo_winy
	stop

*exit
	if s ! "" {
		dialog "終了前に保存しますか?", 2
		if stat = 6 {
			dialog "", 17
			if stat : notesave refstr
		}
	}
	end // なければ終了できなくなるので必ず入れること!
システム変数iparamには、ユーザーが閉じる処理を選択した(=0)のか、 Windowsのシャットダウンにより閉じようとしている(=1)のかの終了要因がセットされます。 尚、タスクマネージャの強制終了を選択した場合は、onexit命令によるイベントは検知しません。 システム変数wparamには、閉じようとしているウィンドウIDがセットされるので、 ID0をメインウィンドウ、ID1を子ウィンドウとした場合、 ID1が閉じられただけでアプリケーション自体が終了されるようではマズイので、 ID1を閉じる時は、ID1ウィンドウを非表示にするだけで処理しないようにしましょう。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
	onexit gosub *exit
	repeat 3, 1
		screen cnt, 300, 200
		title "ID:" + cnt
	loop
	stop

*exit
	if wparam {
		gsel wparam, -1
		gsel 0, 1
		mes "ID" + wparam + "を閉じました"
		return
	}
	end
次はエラー発生時にジャンプさせる命令を紹介します。
onerror goto/gosub ラベル
goto/gosubジャンプの方法。ジャンプ後にreturnで戻るか戻らないかの設定。
ラベルジャンプ先のラベル(アスタリスクから書くこと!)。
通常はコチラで書いたダイアログが表示されて終了する様になっていますが、 onerror命令を使うと、エラー発生時に自分で処理することが出来る様になります。 エラーが発生しても強制終了しないようにできますが、そのまま処理を続行するのは好ましくありません。 エラー表示を行い、データを保存する必要があるなら保存する処理を行った後、速やかに終了しましょう。 この命令もHSP2では常に一方通行でジャンプ前の処理位置から再開することはできませんでしたが、 HSP3からgosubリターンでジャンプ前の位置に戻せるようになりました。 パラメータにgotogosubかを指定できるようになったわけですが、 指定しない場合はHSP2との互換性の関係でgotoジャンプを行います。 また、エラーが発生しても一時的にジャンプしないようにするには、 「onerror 0」を、ジャンプを再開するには「onerror 1」を指定してください。 当然、ジャンプ中断している時にエラーが発生すれば、通常のダイアログが表示されて強制終了されます。 システム変数iparamは、使用されず常に0がセットされますが、 システム変数wparamには、エラー用システム変数errと同じエラーコードが、 システム変数lparamには、エラーの発生行番号がセットされる様になっています。 尚、エラー行番号はスクリプトで実行している場合だけ有効なもので、 実行ファイルにして、エラー行位置を取得させても−1がセットされて、実際の行番号は取得できません。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
	onerror *error
	mes 1 / 0
	stop

*error
	sdim msg, 128
	if wparam =  1 : msg = "予期しない自体が発生したようです"
	if wparam =  2 : msg = "スクリプトに書いた文法が間違っているようです"
	if wparam =  3 : msg = "指定すべきパラメータに問題があるようです"
	if wparam =  4 : msg = "不正な計算式を処理しようとしたようです"
	if wparam =  5 : msg = "省略できないパラメータを省略したようです"
	if wparam =  6 : msg = "指定すべきパラメータの型がおかしいようです"
	if wparam =  7 : msg = "指定した配列要素番号は用意されてないようです"
	if wparam =  8 : msg = "指定したラベルが無効なようです"
	if wparam =  9 : msg = "多重にネストしすぎているようです"
	if wparam = 10 : msg = "リターンすべき箇所が見つからないようです"
	if wparam = 11 : msg = "ループのはじめが見つからないようです"
	if wparam = 12 : msg = "指定したファイルは無効なようです"
	if wparam = 13 : msg = "指定した画像ファイルは無効なようです"
	if wparam = 14 : msg = "外部のファイル呼び出しに失敗したようです"
	if wparam = 15 : msg = "カッコの数が合ってないようです"
	if wparam = 16 : msg = "指定できるパラメータ数よりも多く指定しているようです"
	if wparam = 17 : msg = "文字列の許容量を超えたようです"
	if wparam = 18 : msg = "代入しようとしているものは変数じゃないようです"
	if wparam = 19 : msg = "0除算しようとしているようです"
	if wparam = 20 : msg = "指定位置の文字列情報は参照できないようです"
	if wparam = 21 : msg = "現在は非サポートな機能を使用しようとしているようです"
	if wparam = 22 : msg = "計算式にカッコを使いすぎているようです"
	if wparam = 23 : msg = "パラメータに変数以外を指定しているようです"
	if wparam = 24 : msg = "整数を指定すべき箇所に実数または文字列が指定されたようです"
	if wparam = 25 : msg = "配列変数の要素指定方法が間違っているようです"
	if wparam = 26 : msg = "メモリ確保に失敗したようです"
	if wparam = 27 : msg = "変数の型初期化に失敗しているようです"
	if wparam = 28 : msg = "関数の指定パラメータが間違っているようです"
	if wparam = 29 : msg = "スタックが破壊されてしまったようです"
	if wparam = 30 : msg = "パラメータに相応しくない名称が指定されたようです"
	if wparam = 31 : msg = "配列変数に複数の型を混在させようとしたようです"
	if wparam = 32 : msg = "関数のパラメータ書式が間違っているようです"
	if wparam = 33 : msg = "配置オブジェクトが多すぎるようです"
	if wparam = 34 : msg = "指定したものは配列変数・関数ではないようです"
	if wparam = 35 : msg = "モジュールのパラメータが指定されてないようです"
	if wparam = 36 : msg = "モジュールの初期化に失敗したようです"
	if wparam = 37 : msg = "変数の型変換に失敗したようです"
	if wparam = 38 : msg = "指定したDLL呼び出しに失敗したようです"
	if wparam = 39 : msg = "指定したCOMオブジェクトは呼び出せないようです"
	if wparam = 40 : msg = "リターンの戻り値を設定してないようです"
	if wparam = 41 : msg = "指定した関数はHSP2まで命令だったもののようです"
	if msg = "" : msg = "未知のエラー形式のようです?"
	dialog msg, 1, "発生行位置:" + lparam
	end
最後にHSP3で追加された割り込み命令を紹介します。 ウィンドウズは各種アプリケーションを制御するのにあらゆるメッセージを投げ、 各種アプリケーション側からもウィンドウズへ様々なメッセージを通知していますが、 100種以上存在するこれらのメッセージをキーとして指定ラベルへジャンプできるようになったわけです。 DLLを併用しなければ実現できなかったことが標準命令だけでも出来るようになったのは大きいですね。 HSPウィンドウに通知されたメッセージに限りますけどね。
oncmd goto/gosub ラベル, メッセージ
goto/gosubジャンプの方法。ジャンプ後にreturnで戻るか戻らないかの設定。
ラベルジャンプ先のラベル(アスタリスクから書くこと!)。
メッセージ捕捉するウィンドウメッセージコード
goto/gosubおよびラベルパラメータはその他のイベント発生命令と同様なので割愛して、 メッセージパラメータが他の命令にはないものなので説明しておきます。 例えば、onclick命令ではクリックされたことをキーとして指定ラベルへジャンプできますが、 oncmd命令で同様のことを実現しようとすればWM_LBUTTONDOWN(=0x0201)を捕捉する必要があります。 WM_LBUTTONDOWNとは「WindowMessage_LeftBUTTONDOWN」の略であり、 ウィンドウズから提供されているメッセージ定数になりますが、HSPはこの定数を知らないので、 定数値0x0201(十進数の513)または#defineで定義した値をoncmd命令のメッセージに設定することで 定数が意味するように「マウス左ボタンを押し下げた」時に指定ラベルへジャンプするようになります。 尚、onclick命令は左ボタン以外にも右ボタン、中ボタンでも「クリックされた」としてジャンプするので、 oncmd命令でもジャンプさせるにはWM_RBUTTONDOWN(=0x0204)、WM_MBUTTONDOWN(=0x0207)も設定します。 一度に設定することはできませんので、面倒ですが1つずつ設定してください。 HSPウィンドウがメッセージを受け取ると、指定ラベルにジャンプし、wparamに各種情報をセットします。 セットされる情報はメッセージにより異なっているので、 どのようなメッセージが存在し、どのような情報を受け取るかは各自で調べてください。 下記サンプルでは「クリック」「キー押下」「終了」メッセージを受け取り処理する例です。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	btn = "左", "右", "中"
	code = 0x01, 0x02, 0x10		// MK_LBUTTON, MK_RBUTTON, MK_MBUTTON
	oncmd gosub *exit, 0x0010	// WM_CLOSE
	oncmd gosub *push, 0x0100	// WM_KEYDOWN
	oncmd gosub *click, 0x0201	// WM_LBUTTONDOWN
	oncmd gosub *click, 0x0204	// WM_RBUTTONDOWN
	oncmd gosub *click, 0x0207	// WM_MBUTTONDOWN
	stop

*click
	foreach btn
		if wparam & code.cnt : mes btn.cnt + "ボタンが押されました"
	loop
	return

*push
	mes "コード「" + wparam + "」のキーが押されました"
	return

*exit
	dialog "終了しますか?", 2
	if stat = 7 : return 1
	end