Windows メッセージの内容

提供: RAD Studio
移動先: 案内検索

メッセージ処理機構の概要 への移動


Windows メッセージは、いくつかのフィールドで構成されるデータ レコードです。 これらのうち最も重要なものは、メッセージを識別する整数値のフィールドです。 Windows には多くのメッセージが定義されており、Messages ユニットにはそれらすべてのメッセージの識別子が宣言されています。 メッセージ内の有用な情報は、その他に 2 つのパラメータ フィールドと 1 つの結果フィールドに格納されています。

一方のパラメータには 16 ビット値が、もう一方には 32 ビット値が格納されます。Windows のコードでは多くの場合、これらのパラメータを wParam および lParam と呼びます。それぞれ word parameter(ワード パラメータ)および long parameter(ロング パラメータ)を意味します。各パラメータには複数の情報が格納されていることが多く、たとえば lParamHi などの名前参照があった場合は、ロング パラメータの上位ワードを参照します。

当初、Windows プログラマは、各パラメータの内容を覚えているか Windows API で調べる必要がありました。現在では、Microsoft 社によりパラメータには名前が付けられています。このいわゆるメッセージ クラッキングによって、各メッセージにどのような情報が伴うかがはるかに理解しやすくなりました。たとえば、WM_KEYDOWN メッセージのパラメータは現在では nVirtKey や lKeyData と呼ばれ、wParam や lParam よりも内容が具体的にわかるようになりました。

Delphi では、メッセージの種類ごとに、各パラメータにわかりやすい名前が付いたレコード型が定義されています。たとえば、マウス メッセージでは、マウス イベントの発生位置の x 座標と y 座標がロング パラメータで渡され、一方は上位ワードに、もう一方は下位ワードに格納されています。マウス メッセージ構造体を使用すれば、どちらのワードがどちらの座標かを気にする必要はありません。lParamLo や lParamHi ではなく XPos や YPos という名前でパラメータを参照するからです。

void MyKeyDownHandler(  HWND hwnd, UINT nVirtKey, BOOL fDown, int CRepeat, UINT flags )
{
  .
  .
  .
}
LRESULT MyWndProc( HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam )
{
  switch(  Message )
  {
    HANDLE_MSG( hwnd, WM_KEYDOWN, MyKeyDownHandler );
    .
    .
    .
}