ウィンドウメッセージを処理する

Windowsのいろいろな機能を使うために、ウィンドウメッセージを処理しなければならない場合がある。
たとえばIMEでの文字入力。
IMEの起動はAPIでできるが、入力した文字の受け取りはメッセージで届くので、それを受け取らなければならない。
文字列ならバッファリングしておけばいいが、制御キー(Delとか)の入力に対する動作は通常ならメッセージ処理内に書いてしまう。
こういうのを全部DXRubyの処理として書いてしまうと柔軟性がなくなるので、どーにかしてRuby側に出せないものか、と考えていた。
いつか複数ウィンドウにも対応したいと考えていて、そうすると別ウィンドウへの入力(クリックなど)を取得する方法も必要となる。
これらを解決する手として、ひとつは「頑張っていろいろ実装する」というのがあるのだが、今後発生するであろういろんな要望に対して、コツコツと自力で実装していくのは大変すぎるから、ユーザーに押し付けようと言う事でウィンドウメッセージを処理する機構を手元のDXRuby1.1に追加してみた。

require 'dxruby'

WM_MOUSEMOVE = 0x0200

x = 0
y = 0

Window.set_event(WM_MOUSEMOVE) do |wparam, lparam|
  x = lparam % 65536
  y = lparam / 65536
end

font = Font.new(32)
Window.loop do
  Window.draw_font(x, y, "A", font)
end

見てのとおり、メッセージの値はWindowsのヘッダから持ってきて自分で定義、wparamとlparamもそのまま流れてくるから自分で加工して使う。
当然ながらメッセージ関連の知識がないとまったく使えない。
Windowsのメッセージプロシージャのラッパみたいなものだ。なんたる手抜き。


これとWin32APIを活用すればIMEでの文字入力もできるはずだ。ちょっと大変だろうけど。
wingui.rbの最大のポイントであるメッセージ処理がDXRuby単体でできるようになってしまえば、もはやヤツと連携させる価値は無くなるのかもしれない。いやでもダイアログとか作ったりするには便利か。
なんにせよ、メッセージを「自由に」扱うことができるというのは強みだ。
コールバックが使えるとかそういうライブラリはあるが、Windowsのウィンドウメッセージをそのまま扱えるというのはなかなかない。
普通の人には使い道は無いかもしれないが、使える人は想像力次第で面白いことができるんじゃないかと思う。