イントロダクション

まず、Win32 APIとウィンドウメッセージについて、簡単に説明しておきましょう。ここであまり詳しく理解する必要はないですから、ああ、こんなものなのかな、という程度に考えておいてください。

Win32 API

Windowsは、プログラマが画面出力やユーザー入力などの処理を簡単に行なうために、基本的な機能をはじめから用意しておいて、プログラマがその機能を自由に使うことができるようにしました。これらの機能は、32ビット版のWindowsではWin32 API (Application Programming Interface) という関数セットの形で与えられています。プログラマは、プログラムの中からこれらのAPIの関数を呼び出すだけで、目的の機能を実現することができるようになったのです。

さて、かつてのHSPの標準機能ではこのWin32 APIの機能を呼び出すことはできませんでしたが、tomさんの開発した拡張プラグインloadlib.dllおよびllmodモジュールを用いることによって、HSPからでもWin32 APIを呼び出すことができるようになりました。さらに、HSP ver2.6からはloadlib.dllの拡張プラグイン命令が標準命令として実装され、DLLなしで使用できるようになっています。そこで、このloadlib命令群とllmodモジュールを駆使して、Win32 APIで提供されるさまざまな機能を実現させていきましょう。

Win32 APIはWindowsの基本的な機能を提供するためのものであり、それらの機能の細かい設定を行なうことができるようになっています。それだけに、多くのAPIでは、呼び出すための手続きが非常に煩雑になってしまいます。また、構造体やポインタといった、本来HSPではまったく現れない概念を導入していかなければなりません。これらはC言語のような他のプログラミング言語から扱うのは容易なのですが、HSPから扱うにはかなり面倒な作業が必要になってきます。HSPの基本機能を使えば実現できるものを、わざわざAPIを使って行なう必要はあまりないでしょうし、いろいろな方々が開発されている拡張プラグインで実現できることならばそれらを使ったほうがよいかもしれません。このページではAPIにこだわって機能実現を図っていくつもりですから、スクリプトも複雑になってきます。もしも挑戦するのならば、そのことを覚悟しておいてください。

ウィンドウメッセージ

ユーザーがマウスやキーボード入力を行なったとき、メニューやツールボタンを選択したとき、あるいはアプリケーションを終了しようとしたときなど、ある特定のウィンドウに対して何らかのイベントが発生したときに、Windowsはそのウィンドウに対してメッセージを送るという形でそのイベントが発生したことを知らせます。このメッセージはイベントごとに固有の数値になっていて、その数値がいくつかの付加情報とともにウィンドウに送られます。

C言語によるGUIプログラミングでは、ウィンドウにどんなメッセージが送られてきたかによってその後の処理を決定するというのが一般的です。HSPは内部でこのメッセージを独自に処理しており、通常プログラマはメッセージの存在をまったく意識することがありません。HSPの標準機能ではメッセージを取得することはできません。しかし、スクリプト内でAPIを呼び出して機能を拡張していくことを考えると、やはりスクリプト内でメッセージの取得ができたほうが便利になってきます。

このページではメッセージを取得するために、私ちょくとが開発した拡張プラグインhsgetmsg.dllを使うことにしています。この拡張プラグインは、ウィンドウに送られる任意のメッセージを取得する機能をHSPに追加するものです。

現在、HSP ver3.0の開発がおにたまさんによって行なわれている最中ですが、このバージョンからは任意のメッセージが送られたときの割り込み実行機能がサポートされる予定です。いずれこの機能がサポートされるようになれば、このページの内容を新しいHSP 3.0の機能を使ったものに書き換えていくつもりです。