メッセージ フック コントロールは、Windows によってフォームまたはコントロールへ送られるメッセージを“フック” (横取り) するためのコントロールです。
Visual Basic の場合、送られてきたメッセージは Visual Basic 内部で処理され、対応するイベント プロシージャを呼び出します。例えば、ユーザがフォームの上でマウスの左ボタンをダブル クリックすると、Windows からフォームに WM_LBUTTONDBLCLK (ウィンドウのクライアント領域をマウスの左ボタンでダブル クリックした) というメッセージが送られます。そして、Visual Basic は Form_DblClick イベント プロシージャを呼び出します。これによって、プログラマはイベントに応じた処理を記述できます。
しかし、Visual Basic が用意しているイベント プロシージャの種類には限りがあり、どんなイベントにも応じられるわけではありません。例えば、フォームのタイトル バーをクリックしたときに何か処理したいとします。ところが、Visual Basic には、このイベントに相当するイベント プロシージャがないため、Visual Basic では実現不可能です。しかし、実際は Windows から WM_NCLBUTTONDOWN (ウィンドウの非クライアント領域でマウスの左ボタンを押した) というメッセージが送られてきています。したがって、このメッセージを受けることができれば、Visual Basic でも実現できることになります。メッセージ フック コントロールは、こういったメッセージを受け取り、Visual Basic で処理できるようにするためのものです。
メッセージには、今の例のようなウィンドウ操作に対するもののほかに、システムから送られてくるもの (システム設定の変更の通知など)、API 関数からのコールバック メッセージなどいろいろあります。つまり、このコントロールを用いることにより、Visual Basic 単体では不可能であったような高度な処理もできるようになるわけです。メッセージ フック コントロールを用いると、例えば次のような処理が可能となります。
- Visual Basic では検出できないイベントの検出を行う
- システムからの通知を受ける
- カラー パレットを独自に操作する
- 低レベル マルチメディア API を用いて、MIDI デバイスや WAVE オーディオ デバイスを操作する (録音、再生など)
さらに、受け取ったメッセージおよび、それとともに渡されるパラメータは、必要に応じてイベント プロシージャ内で変更することができます。そして、フックしたメッセージを、Visual Basic の内部機構へ渡すかどうかを選択することもできます。内部機構へ渡さないようにすれば、メッセージ処理を完全にカスタマイズすることも可能です。
メッセージ フック コントロールの概念図を図 1 に示します。
しかし、柔軟な処理が可能な反面、危険も伴います。メッセージの意味が分からないにもかかわらず、受け取ったパラメータをむやみに変更したりすると、予期しない結果が生じることがあります。また、プログラム上では正しくても、Visual Basic の内部機構と競合して期待通りに動作しないこともあります。したがって、Windows のメッセージや API に関する知識がある程度必要になります。メッセージ フック コントロールを用いたプログラムをデバッグするときは、ソース コードを頻繁に保存されることをお勧めします。