<   2008年 07月 ( 1 )   > この月の画像一覧

[CoveredCalc for Windows] メッセージの横取り

Windows版のおはなし。

現在開発中の CoveredCalc のメインはキーカスタマイズなのですが、そのカスタマイズを行うダイアログではどのキーとどの機能を結びつけるかを設定します。「どのキー」を指定するためにキー入力して押されたキーを表示するコントロールを作りました。作りましたっていってもただの Edit コントロールをサブクラス化しただけなんですが‥‥。このコントロールにフォーカスを移した状態で、例えば Shift キーと H キーを押せば、コントロールに「Shift+H」と表示されて Shift+H に対する機能の割り当てができるわけです。
ところが、Alt キーと他のキーを押したとき、コントロールには「Alt+××」と入力されるのですが、そのあと、ダイアログ上のアクセスキーが反応してしまって、別の機能が実行されます。例えば「割り当て(A)」というボタンがあるのですが、Alt+A を押すとこのボタンが押されたことになってしまいます。
‥‥というのが今月のあたまに起こっていたこと。

WM_SYSKEYDOWN メッセージで処理したよと返してやってもシステムが勝手にやっちゃうみたいなんで、BeOS の BMessageFilter みたいに通常のディスパッチに流れる前にメッセージを横取りして、場合によってはディスパッチしなきゃいいんじゃない?と思って、自分のメッセージループにメッセージを横取りする仕組みを加えました。ところが、ダイアログ上ではメッセージが横取りできませんでした。それもそのはず、モーダルダイアログが表示されているときは、Windows API の DialogBox() 関数の中の Windows の用意したメッセージループにいるのです。自分のメッセージループでは横取りできません。ぐはー。
‥‥というのが 2 週間ほど前に起こっていたこと。

どうやって解決しようかなー、MFC みたいにモーダルダイアログに見えるけど実はモードレスダイアログで作って自分のメッセージループを回していましたー的な方法はどうかなー? と思いながら、すごく面倒くさくなって 2 週間プログラムを放置してました。おかげでドラクエ IV が結構進みました(爆)
昨日になって、ようやく、その似非モーダルダイアログを実装してみました。その結果、期待した動きを得ることができました。つーか実装に 1 時間もかかってない気が‥‥。2 週間の放置はなんだったんだろう。
[PR]
by hironytic | 2008-07-24 10:23 | 開発状況