今回はhsgetmsg.dllが提供する拡張プラグイン命令と、hsgetmsg.asで定義されているモジュール命令の使い方を説明します。
hsgetmsg.dllのメッセージ取得機能を使ったスクリプトを書く場合には、メッセージが送られているかどうかを常に監視しなければならにために、スクリプトの全体的な構成を以下のようにしなければなりません。
ウィンドウのサブクラス化を行なうには2つの方法があります。
通常はこちらのほうで大丈夫でしょう。
現在描画中のHSPウィンドウのサブクラス化を行ないます。この命令後、サブクラス化に成功するとstatにウィンドウハンドルが格納されます。失敗すると0が格納されます。
メッセージ取得時にモジュール命令get_messageを用いた場合にはstatにウィンドウIDが、DLL命令ll_getmessageを用いた場合にはstatに(ウィンドウID+1)の値が代入されます。
p1にはサブクラス化するウィンドウのハンドルを指定します。このパラメータを省略するか0を指定すると、現在描画先に指定されているウィンドウが指定されます。
p2の値は、gm_getmessageを実行してメッセージを取得したときに、そのメッセージがこのウィンドウに送られたメッセージだった場合にstatにこの値を格納します。複数のウィンドウをサブクラス化する場合にそれらを識別する値として用いることができます。上記のモジュール命令set_subclassでは、この値として(ウィンドウID+1)を指定しています。
この命令後、サブクラス化に成功するとstatに0が格納されます。失敗すると0以外の値が格納されます。
設定可能なウィンドウの数に制限はありません。また、一度設定されたウィンドウに対して行なっても、効果はありません。
HSPウィンドウに対してサブクラス化を行なう場合にはset_subclassを使った方がよいでしょう。gm_setwndprocを使うことはほとんどないと思います。
メッセージの設定には以下の2つの方法があります。
描画先に指定されているHSPウィンドウに対してメッセージを設定する場合にはset_messageを使います。通常はこちらを使用します。
ウィンドウメッセージには、メッセージコードのほかに、2つの付加情報とともにウィンドウプロシージャへ送られます。この2つのパラメータは、wParamパラメータおよびlParamパラメータと呼ばれています。これらのパラメータとして、どのような情報が送られてくるのかはメッセージによって異なります。
さて、hsgetmsg.dllでは、送られてきたメッセージのwParamパラメータやlParamパラメータの値によってそのメッセージを取得するかどうかを制限したり、もしくはメッセージを元のウィンドウプロシージャに送らないようにしたりするオプション指定ができます。これには、set_message命令やgm_setmessage命令を実行する直前にgm_setoptionを使います。
p1は以下の値を組み合わせによって指定します。
p1の値 | 意味 | |
---|---|---|
GM_F_WPARAM | 3 | wParamがp2と等しいときのみ取得 |
GM_F_LPARAM | 12 ($C) | lParamがp3と等しいときのみ取得 |
GM_F_RETVALUE | 16 ($10) | メッセージを元のウィンドウプロシージャには送らずに、p4の値を戻り値として返す |
GM_F_THROWAWAY | 32 ($20) | メッセージ情報を保存しない |
ただ、このgm_setoption命令を使うことはめったにないと思うので、よく分からなければ読み飛ばしてしまってもかまいません。
メッセージの取得には以下の2つの方法があります。
get_message命令は、取得されたメッセージがあれば、その情報を変数p1に格納します。取得メッセージがない場合には、p1.0の値が0になります。メッセージが送られたウィンドウがset_message命令によって設定されている場合は、システム変数statにメッセージを受け取ったウィンドウのIDが格納されます。gm_setmessage命令によって設定されたウィンドウの場合は、gm_setmessage命令の2番目のパラメータに指定した値から1を引いた値が格納されます。
また、できるだけ以前のバージョンとの互換性を保つため、p1を省略した場合には、グローバル変数msgvalに格納されるようになっています。
この命令を実行したときに、メッセージが送られていれば、指定された変数p1にはその情報が以下のように格納されます。
一方、取得メッセージない場合にはp1.0に0が格納されるので、メッセージが送られているかどうかはこれで判断するようにしましょう。
gm_getmessage命令は、get_message命令と同様にしてメッセージを取得します。ウィンドウにメッセージが送られている場合は、システム変数statに、ウィンドウのサブクラス化の際にgm_setmessage命令の2番目のパラメータに指定した値が格納されます。
見ればわかると思いますが、上のモジュール命令get_messageは、gm_getmessageを実行した後にstatの値を1小さくしているだけです。
次回は具体的なスクリプトを作成して、実際にメッセージ取得の見本を見せてみたいと思います。