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

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

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

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

ページ移動

1-3-7. メッセージ

 Windowsの通常のメッセージは、WX_XXXの名前で定義されています。コントロールのメッセージは、EM_XXXなどの別の名前があります。またユーザが自由に使うことのできる、WM_USERと言うメッセージもあります。ここで少しメッセージのことを考えてみたいと思います。

メッセージの発生

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

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

ポストとセンド

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

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

ページ移動