アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

2-1-6. メッセージの働き

 Windowsは、イベントドリブンなGUIシステムです。あるできごと(イベント)が起こったことできっかけで、システムが動作(ドリブン)します。逆に言えばできごとがなければ、なんら動作しません。そして、できごとをパッケージしてデータ化したものがメッセージです。あちこちに渡され、動作の元になるのでこの名前が付きました。

メッセージの発生

 まずメッセージが、発生するメカニズムです。メッセージは、キーやマウスで操作した時に発生します。また、CreateWindow などのAPIコールでも発生します。メッセージを発行するAPIもあります。例えば、WM_PAINT メッセージは、ShowWindow 関数でウィンドウをオープンした時に発生します。また、ウィンドウを最大化や最小化して復帰した場合や、リサイズやの操作した場合、そして複数のウィンドウが重なっており、操作により上のウィンドウが除かれた場合などなど、もろもろの操作でも発生します。それに比べ、WM_CREATE メッセージは、CreateWindow 関数をコールした時に1回だけコールされます。この様にメッセージには1回だけのものも、何万・何億回も発生するものもあります。
 また、WM_TIME は、タイマー設定し特定の時間になると発生します。さらに、ユーザが自分だけの機能を搭載するための、WM_USER メッセージもあります。

 メッセージは、メッセージを発生します。1つのメッセージが別のメッセージを作成します。それがまたと連鎖します。例えば、WM_KEYDOWN メッセージは、WM_CHAR,WM_COMMAND,WM_KEYUP などの連鎖の可能性があります。

ポストとセンド

 メッセージには、ポストセンドの2種類の動作があります。ポストとは、キュー(メッセージループで説明)にメッセージを積む行為を指します。それに対して、センドとは、プロシージャにメッセージを送出する動作を言います。ポストは積むだけですぐ終了します。積まれたメッセージは、いつか処理されます。それに比べてセンドしたメッセージは、プロシージャをコールし、そのプロシージャが処理を終わるまで制御は返ってきません。そしてプロシージャの返り値がそのまま得られます。PostMessage 関数で、ポストし、SendMessage 関数でセンドします。通常、ポスト処理はシステムが行ないます。自動実行や何か特殊な動作を行なうとき以外は、あまり使わないと思います。それに比べセンドは、あちこちで使用します。特にコントロールやダイアログボックスの操作は、センド処理のオンパレードです。

 メッセージは第2のAPIです。この場合は、センド動作を言います。メッセージをセンドして対象のウィンドウに、特定の動作を要求できます。またセンドして、何らかの値を取得することもできます。つまりウィンドウの動作を制御したり、状態を取得することがメッセージで可能です。例えば、MDIの機能は、APIは4つしかありません。それに比べアクティブ化や破棄は、12種類のメッセージで行ないます。システムで定義済みのクラスであるコントロールの制御は、大部分はメッセージをセンドすることで実行します。

メッセージの種類

 メッセージは、大きく分けて、Windosの本体が処理するものと、コントロールやマルチメディアのためのものがあります。
メッセージ 通知 種類 内容
ACM_XXX ACN_XXX Common アニメーションコントロールメッセージ
BM_XXX BN_XXX Control ボタンメッセージ
CB_XXX CBN_XXX Control コンボボックスメッセージ
CDM_XXX CDN_XXX   コモンダイアログボックスメッセージ
CPL_XXX     コントロールパネルメッセージ
DBT_XXX     デバイスメッセージ
DL_XXX   Common ドラッグリストメッセージ
DM_XXX   Dialog ダイアログボックスメッセージ
EM_XXX EN_XXX Control エディトコントロールメッセージ
HDM_XXX HDN_XXX Common ヘッダーコントロールメッセージ
HKM_XXX   Common ホットキーコントロールメッセージ
ICM_XXX   Media ビデオ圧縮メッセージ
LB_XXX LBN_XXX Control リストボックスメッセージ
LVM_XXX LVN_XXX Common リストビューコントロールメッセージ
MCIWNDM_XXX   Media MCIウィンドウメッセージ
MIM_XXX   Media MIDI入力デバイスコールバックメッセージ
MM_XXX   Media マルチメディアメッセージ
MMIOM_XXX   Media マルチメディアI/Oメッセージ
MOM_XXX   Media MIDI出力デバイスコールバックメッセージ
  NM_XXX System 通知メッセージ
PBM_XXX   Common プログレスバーメッセージ
PSM_XXX PSN_XXX Common プロパティシートメッセージ
SB_XXX   Common ステータスウィンドウメッセージ
SBM_XXX   Control スクロールバーメッセージ
STM_XXX STN_XXX Control スタティックコントロールメッセージ
TB_XXX   Common ツールバーメッセージ
TBM_XXX TBN_XXX Common トラックバーメッセージ
TCM_XXX TCN_XXX Common タブコントロールメッセージ
TTM_XXX TTN_XXX Common ツールヒントメッセージ
TVM_XXX TVN_XXX Common ツリービューメッセージ
UDM_XXX UDN_XXX Common スピンボタンコントロールメッセージ
WIM_XXX   Media ウェーブフォームオーディオ入力メッセージ
WM_XXX   System Windowsその他の全メッセージ
WOM_XXX   Media ウェーブフォームオーディオ出力メッセージ
Control・・・コントロール関連のメッセージ
Common・・・コモンコントロール関連のメッセージ
Daialog・・・ダイアログボックス関連のメッセージ
Medeia・・・マルチメディア関連のメッセージ
System・・・Windowsの本体のシステム関連のメッセージ

ページ移動