トップWindows入門 > Windowsメッセージ

Windowsメッセージ

このサイトで紹介しているプログラムで使用しているメッセージを中心に少しずつ記述してゆく。

1.Windowsメッセージ一覧表

(1)通常のメッセージ WM_***(アルファベット順 or 値順)

メッセージ順 値順    (値順に並び替えるときは、'値順'ラジオボタンをチェックしてください)

2.Windowsメッセージの概要

WM_ACTIVATE

WM_ACTIVATE メッセージは、アクティブ化または非アクティブ化されようとしているウィンドウに送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam : 下位ワードはアクティブ化フラグfActive。
       上位ワードはウィンドウが最小化されているかどうか。
        0 以外の値ならばウィンドウは最小化。 0 ならばウィンドウは最小化されていない。

lParam : fActiveが 0 (WA_INACTIVE) のときは、新しくアクティブになったウィンドウのハンドル。
       それ以外の値のときは、それまでアクティブだったウィンドウのハンドル

アクティブ化フラグ fActive は以下の値のいずれか。
意味
0 (WA_INACTIVE)非アクティブ化される
1 (WA_ACTIVE) マウスクリック以外の方法(例えば、キーボードインターフェースによる選択や、 SetActiveWindow 関数によるもの)でアクティブ化される
2 (WA_CLICKACTIVE)マウスクリックによってアクティブ化される
【返却値】

 WindowProc関数は、このメッセージを処理したとき、0 を返す。

【リンク】
1. WM_ACTIVATE[msdn]
2. WM_ACTIVATE

WM_CLOSE

ユーザーは [閉じる] ボタンをクリックするか、 Alt + F4 キーなどのキーボード ショートカットを使ってアプリケーション ウィンドウを閉じることができる。 これらの動作によってウィンドウは WM_CLOSE メッセージを受け取る。 WM_CLOSE メッセージでは、ユーザーにプロンプトを表示することができる。 ここで本当にウィンドウを閉じる場合は DestroyWindow 関数を呼び出すが、 それ以外の場合は WM_CLOSE メッセージからゼロを返し、 オペレーティング システムがメッセージを無視して、ウィンドウは破棄されない。

プログラムが WM_CLOSE を処理する例を以下に示す。

case WM_CLOSE:
    if (MessageBox(hwnd, "Really quit?", "My application", MB_OKCANCEL) == IDOK)
        DestroyWindow(hwnd);
    // Else: ユーザーがキャンセルし、何もしない
    return 0;

破棄されるウィンドウは WM_DESTROY メッセージを受け取る。 このメッセージはウィンドウが画面から削除された後、 かつ破棄が実行される前に送信されます (具体的にはすべての子ウィンドウが破棄される前)。

【パラメータ】

wParam : なし

lParam : なし

【返却値】

 WindowProc関数は、このメッセージを処理したとき、0 を返す。

WM_COMMAND

ユーザーがメニューアイテムを選択した場合、 コントロールが親ウィンドウに通知メッセージを送った場合、 およびアクセラレータキー操作が変換された場合に送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam : 下位ワードはメニューアイテム、コントロール、アクセラレータの ID。
       上位ワードはコントロールの場合は通知コード、アクセラレータの場合は1、メニューの場合は0。

lParam : コントロールの場合、ウィンドウハンドル、その他の場合0。

【返却値】

 WindowProc関数は、このメッセージを処理したとき、0 を返す。

WM_CREATE

アプリケーションがCreateWindowEx関数またはCreateWindow関数でウィンドウの生成を要求した時送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam : なし

lParam : 生成されたウィンドウに関する情報を含むCREATESTRUCT構造体を指すポインタ

【返却値】

 WindowProc関数は、このメッセージを処理したとき、0 を返す。 -1 を返した場合、ウィンドウは廃棄され、 CreateWindowEx関数またはCreateWindow関数は NULLハンドルを返す。

WM_CTLCOLORSTATIC

スタティックコントロール、ラジオボタンコントロール、 チェックボックスコントロールなどが描画される直前に送られる。 WindowProc関数を経由して、このメッセージを受け取る。 これを受けて、コントロールの文字色や背景色を変更できる。

【パラメータ】

wParam : コントロールのデバイスコンテキストのハンドル

lParam : コントロールのハンドル

【返却値】

 WindowProc関数は、このメッセージを処理したとき、 コントロールの背景を描くブラシのハンドルを返す。

WM_DESTROY

WM_DESTROYメッセージはウィンドウが破棄されるとき、スクリーン上からウィンドウが消えた後に送られる。 WindowProc関数を経由して、このメッセージを受け取る。 このメッセージは、まず破棄されるウィンドウに、そして次に(もしあれば)子ウィンドウに送られる。 したがって、メッセージの処理中は、子ウィンドウがすべてまだ存在する。

【パラメータ】

wParam : なし

lParam : なし

【返却値】

 WindowProc関数は、このメッセージを処理したとき、0 を返す。

WM_DRAWITEM

オーナー・ドローのコントロールやメニューの親ウィンドウに、 項目を表示するときや選択されたときなどに送られる。

【パラメータ】

wParam : WM_DRAWITEMメッセージを送ったコントロールのID。メニューの場合は 0 。

lParam : DRAWITEMSTRUCT構造体へのポインタ。この構造体に描画アイテムの情報および描画タイプを含む。

typedef struct tagDRAWITEMSTRUCT {
    UINT CtlType;	// 描画対象のタイプ。ODT_MENU: メニュー, ODT_LISTBOX:リストボックスなど
    UINT CtlID;
    UINT itemID;
    UINT itemAction;
    UINT itemState;
    HWND hwndItem;
    HDC  hDC;
    RECT rcItem;	// 項目の大きさ
    ULONG_PTR itemData;
} DRAWITEMSTRUCT;
【返却値】

 WindowProc関数は、このメッセージを処理したとき、TRUE を返す。

WM_HSCROLL

水平スクロールバーが操作された時送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam :
wParamの下位ワード意味
SB_LINELEFT0 1 行左へスクロール:スクロール・バーの左端にある三角形<のついたボタンを押したとき
SB_LINERIGHT1 1 行右へスクロール:スクロール・バーの右端にある三角形>のついたボタンを押したとき
SB_PAGELEFT2 1 ページ左へスクロール:スクロール矢印とスクロールボックス(つまみ、サム)の間を押したとき
SB_PAGERIGHT3 1 ページ右へスクロール:スクロール矢印とスクロールボックスの間を押したとき
SB_THUMBPOSITION4 絶対位置へスクロール:スクロールボックスが押されたとき、 wParamの上位ワードはスクロールボックスの現在位置を示す。
SB_THUMBTRACK5 指定位置へスクロール ボックスをドラッグ。スクロールボックスが離されたとき、 wParamの上位ワードはスクロールボックスの現在位置を示す。
SB_LEFT6最左へのスクロール命令
SB_RIGHT7最右へのスクロール命令
SB_ENDSCROLL8スクロールが終了。 SB_LINELEFT,SB_LINERIGHT,SB_PAGELEFT,SB_PAGERIGHTと対で、およびドラッグをやめ、マウスの左ボタンを離したとき送られてくる。

lParam : スクロールバーのハンドル。標準スクロールバーの場合、NULL。

【返却値】

WindowProc関数は、このメッセージを処理したとき、0 を返す。

【解説】

SB_LEFT, SB_RIGHTメッセージはスクロールバーへの操作で発生するものではない。 例えば Homeキーが押されたとき、WM_KEYメッセージ処理から (WM_HSCROLL, SB_LEFT)メッセージを送るようにして使う。 Ctrl+Homeキーのとき (WM_HSCROLL, SB_LEFT)とする。 しかし、ファイル選択ダイアログではスクロールバーが三つになるケースがある。 キーの割り当てが複雑だと実際上使えない。 少し、操作してみた限りでは、SB_LEFTやSB_RIGHTの操作はできなかった。

SB_LEFT, SB_RIGHT は VSCROLLで使われる SB_TOP, SB_BOTTOM を使ってもよい。値は同じある。 同様に、**LEFT を **UP、**RIGHT を **DOWN としてもよい。

WM_KILLFOCUS

ウィンドウがキーボード・フォーカスを失う直前に送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam: キーボード・フォーカスを受け取るウィンドウのハンドル。NULLの場合もある。

lParam: なし

【返却値】

WindowProc関数は、このメッセージを処理したとき、0 を返す。

WM_LBUTTONDBLCLK

WM_LBUTTONDBLCLK メッセージは、ウィンドウのクライアント領域でユーザーがマウスの左ボタンを ダブルクリックしたときに送られる。 マウスキャプチャーされている場合は、メッセージはキャプチャーしているウィンドウに送られる。 キャプチャーされていない場合は、マウスカーソルの下にあるウィンドウに送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam: キーフラグ。

lParam: 上位ワードはカーソルのY座標、下位ワードはX座標。

wParamはどの仮想キーが押されているかが示される。 WM_LBUTTONDOWNに示したものと同じである。 【返却値】

WindowProc関数は、このメッセージを処理したとき、0 を返す。

【解説】

ウィンドウクラスのスタイルに CS_DBLCLKS スタイルを持つウィンドウのみが WM_LBUTTONDBLCLK メッセージを受け取ることができる。

WM_LBUTTONDOWN

WM_LBUTTONDOWN メッセージは、ウィンドウのクライアント領域で ユーザーがマウスの左ボタンを押したときに送られる。 マウスキャプチャーされている場合は、メッセージはキャプチャーしているウィンドウに送られる。 キャプチャーされていない場合は、マウスカーソルの下にあるウィンドウに送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam: キーフラグ。

lParam: 上位ワードはカーソルのY座標、下位ワードはX座標。

wParamはどの仮想キーが押されているかが示される。以下の値の組み合わせとなる。
意味
0x0001 (MK_LBUTTON)マウスの左ボタンが押されています。
0x0002 (MK_RBUTTON)マウスの右ボタンが押されています。
0x0004 (MK_SHIFT)[Shift] キーが押されています。
0x0008 (MK_CONTROL)[Ctrl] キーが押されています。
0x0010 (MK_MBUTTON)マウスの中央ボタンが押されています。
【返却値】

WindowProc関数は、このメッセージを処理したとき、0 を返す。

WM_MOUSELEAVE

マウスカーソルが予めTrackMouseEvent関数によって登録されたウィンドウの クライアント領域から離れたとき送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam: なし

lParam: なし

【返却値】

WindowProc関数は、このメッセージを処理したとき、0 を返す。

WM_MOUSEMOVE

WM_NOTIFYメッセージは、マウスカーソルが移動するとき、ウィンドウに送られる。 マウスがキャプチャされているときそのウィンドウへ、 そうでないときは、カーソルを含むウィンドウに送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam: キーフラグ。

lParam: 上位ワードはカーソルのY座標、下位ワードはX座標。

wParamはどの仮想キーが押されているかが示される。 その値はWM_LBUTTONDOWNメッセージと同じである。

【返却値】

WindowProc関数は、このメッセージを処理したとき、0 を返す。

WM_NOTIFY

WM_NOTIFYメッセージは、コモンコントロールでイベントが起こった場合、 およびコモンコントロールが情報を親ウィンドウに要求する場合に、 コモンコントロールの親ウィンドウに送信される。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam : イベントが発生したコモンコントロールのID。IDはユニークとは限らないため、 NMHDR構造体のhwndFromメンバ、もしくは idFromメンバで、コントロールを識別する。

lParam : NMHDR構造体、あるいはNMHDR構造体を最初のメンバに持つ構造体のアドレス。

【返却値】

 特定のメッセージにおいて戻り値が指定されている場合を除いて、戻り値は無視される。

WM_PAINT

クライアントエリアに更新領域が存在するとき送られてくる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam : なし

lParam : なし

【返却値】

WindowProc関数は、このメッセージを処理したとき、0 を返す。

WM_RBUTTONDOWN

WM_RBUTTONDOWN メッセージは、ウィンドウのクライアント領域で ユーザーがマウスの左ボタンを押したときに送られる。 マウスキャプチャーされている場合は、メッセージはキャプチャーしているウィンドウに送られる。 キャプチャーされていない場合は、マウスカーソルの下にあるウィンドウに送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam: キーフラグ。

lParam: 上位ワードはカーソルのY座標、下位ワードはX座標。

wParamはどの仮想キーが押されているかが示される。以下の値の組み合わせとなる。
意味
0x0001 (MK_LBUTTON)マウスの左ボタンが押されています。
0x0002 (MK_RBUTTON)マウスの右ボタンが押されています。
0x0004 (MK_SHIFT)[Shift] キーが押されています。
0x0008 (MK_CONTROL)[Ctrl] キーが押されています。
0x0010 (MK_MBUTTON)マウスの中央ボタンが押されています。
【返却値】

WindowProc関数は、このメッセージを処理したとき、0 を返す。

WM_SETFOCUS

ウィンドウがキーボード・フォーカスを得た時送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam: キーボード・フォーカスを失ったウィンドウのハンドル。NULLの場合もある。

lParam: なし

【返却値】

WindowProc関数は、このメッセージを処理したとき、0 を返す。

WM_SIZE

ウィンドウ・サイズが変化した時送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam : サイズ変更タイプ
意味
SIZE_MAXHIDE 4 ある他のウィンドウが最大化されたとき、すべてのポップアップウィンドウに送られる。
SIZE_MAXIMIZED 2ウィンドウが最大化された。
SIZE_MAXSHOW 3ある他のウィンドウが元のサイズに戻されたとき、 すべてのポップアップウィンドウに送られる。
SIZE_MINIMIZED 1 ウィンドウが最小化された。
SIZE_RESTORED 0ウィンドウ・サイズが変更された。ただし、最小化でも最大化でもない。

lParam : 下位ワードはクライアント領域の幅、上位ワードは高さ。

【返却値】

WindowProc関数は、このメッセージを処理したとき、0 を返す。

WM_VSCROLL

垂直スクロールバーが操作された時送られる。 WindowProc関数を経由して、このメッセージを受け取る。

【パラメータ】

wParam :
wParamの下位ワード意味
SB_LINEUP0 1 行上へスクロール:スクロール・バーの上端にある三角形▲のついたボタンを押したとき
SB_LINEDOWN1 1 行下へスクロール:スクロール・バーの下端にある三角形▼のついたボタンを押したとき
SB_PAGEUP2 1 ページ上へスクロール:スクロール矢印とスクロールボックス(つまみ、サム)の間を押したとき
SB_PAGEDOWN3 1 ページ下へスクロール:スクロール矢印とスクロールボックスの間を押したとき
SB_THUMBPOSITION4 絶対位置へスクロール:スクロールボックスが押されたとき、 wParamの上位ワードはスクロールボックスの現在位置を示す。
SB_THUMBTRACK5 指定位置へスクロール ボックスをドラッグ。スクロールボックスが離されたとき、 wParamの上位ワードはスクロールボックスの現在位置を示す。
SB_TOP6最上へのスクロール命令
SB_BOTTMOM7最下へのスクロール命令
SB_ENDSCROLL8スクロールが終了。 SB_LINEUP,SB_LINEDOWN,SB_PAGEUP,SB_PAGEDOWNと対で、およびドラッグをやめ、マウスの左ボタンを離したとき送られてくる。

lParam : スクロールバーのハンドル。標準スクロールバーの場合、NULL。

【返却値】

WindowProc関数は、このメッセージを処理したとき、0 を返す。

【解説】

SB_TOP, SB_BOTTOMメッセージはスクロールバーへの操作で発生するものではない。 例えば Homeキーが押されたとき、WM_KEYメッセージ処理から (WM_VSCROLL, SB_TOP)メッセージを送るようにして使う。 Ctrl+Homeキーのとき (WM_VSCROLL, SB_TOP)とする。 しかし、ファイル選択ダイアログではスクロールバーが三つになるケースがある。 キーの割り当てが複雑だと実際上使えない。 少し、操作してみた限りでは、SB_TOPやSB_BOTTOMの操作はできなかった。