Itefuというライブラリの機能の一部として用意されているシンプルなDLLで、C++で書かれています。特定のウィンドウにウィンドウプロシージャを登録し、指定したイベントを検出したり、デフォルトの処理を中断させることができます。
RGSS3に組み込まれているRubyには、DLLを利用するための拡張ライブラリが付属しています(名称は〝Win32API〟ですが、自前のDLLも呼ぶことができます)。この機能を使ってitefu_hook.dllの関数を呼び出すことで、Ruby側からWM_CLOSE
を検出することができるようになります。
まずWM_CLOSE
を定義します。これはWindows APIで定義されている値をそのまま指定します。
|
|
次にitefu_hook.dllを利用して、WM_CLOSE
をフックします。Itefuには、itefu_hook.dllを簡単に利用できるよう、Itefu::Win32::Hook
というモジュールが用意さているので、それを使用します。
|
|
これによって、WM_CLOSE
が送られて来たかどうかを検出できるようになります。
|
|
WM_CLOSE
をフックする際に、Itefu::Win32::Hook.hook_window_message(WM_CLOSE, true)
と、第2引数でtrue
を指定していますが、これによってウィンドウプロシージャはデフォルトの処理(WM_CLOSE
ならウィンドウを閉じてアプリケーションを終了するなど)を行わなくなります。
ウィンドウプロシージャのデフォルトの処理でウィンドウを閉じられると、終了処理を行う前にアプリケーションが終了してしまうので、自動セーブができません。従って、このケースでは、WM_CLOSE
を検出した後、ゲーム中でゲーム終了を行ったときと同じような処理を行ってから、アプリケーションを終了するようにする必要があります。
以上で、RGSS3のゲームを、ウィンドウの閉じるボタンやAlt+F4で終了した場合でも、通常のゲーム終了時と同じ終了処理を行えるようになりました。そこで自動セーブを行うようにすれば、ゲーム終了時の自動セーブを実装できます。<終>