WM_SYSCOMMAND メッセージ
ウィンドウは、ユーザーが [ウィンドウ ] メニュー (以前はシステムまたはコントロール メニュー) からコマンドを選択したとき、またはユーザーが最大化ボタン、最小化ボタン、復元ボタン、または閉じるボタンを選択したときに、このメッセージを受け取ります。
#define WM_SYSCOMMAND 0x0112
例
case WM_SYSCOMMAND:
if ((wParam & 0xFFF0) == SC_CLOSE)
{
EndDialog (hDlg, TRUE);
return(TRUE);
}
break;
GitHub 上の Windows クラシック サンプルからの例。
パラメーター
-
wParam
-
要求されたシステム コマンドの種類。 このパラメーターには、次の値のいずれかを指定できます。
値 説明 - SC_CLOSE
- 0xF060
ウィンドウを閉じます。 - SC_CONTEXTHELP
- 0xF180
ポインターを使用して、カーソルを疑問符に変更します。 ユーザーがダイアログ ボックスでコントロールをクリックすると、コントロールは WM_HELP メッセージを受け取ります。 - SC_DEFAULT
- 0xF160
既定の項目を選択します。ユーザーがウィンドウ メニューをダブルクリックしました。 - SC_HOTKEY
- 0xF150
アプリケーション指定のホット キーに関連付けられているウィンドウをアクティブにします。 lParam パラメーターは、アクティブにするウィンドウを識別します。 - SC_HSCROLL
- 0xF080
水平方向にスクロールします。 - SCF_ISSECURE
- 0x00000001
スクリーン セーバーが安全かどうかを示します。 - SC_KEYMENU
- 0xF100
キーストロークの結果としてウィンドウ メニューを取得します。 詳細については、「解説」を参照してください。 - SC_MAXIMIZE
- 0xF030
ウィンドウを最大化します。 - SC_MINIMIZE
- 0xF020
ウィンドウを最小化します。 - SC_MONITORPOWER
- 0xF170
表示の状態を設定します。 このコマンドは、バッテリ駆動のパーソナル コンピューターなど、省電力機能を備えたデバイスをサポートします。
lParam パラメーターには、次の値を指定できます。- -1 (ディスプレイの電源が入ります)
- 1 (ディスプレイは低電力になります)
- 2 (ディスプレイがシャットダウン中)
- SC_MOUSEMENU
- 0xF090
マウス クリックの結果としてウィンドウ メニューを取得します。 - SC_MOVE
- 0xF010
ウィンドウを移動します。 - SC_NEXTWINDOW
- 0xF040
次のウィンドウに移動します。 - SC_PREVWINDOW
- 0xF050
前のウィンドウに移動します。 - SC_RESTORE
- 0xF120
ウィンドウを通常の位置とサイズに戻します。 - SC_SCREENSAVE
- 0xF140
System.ini ファイルの [boot] セクションで指定されたスクリーン セーバー アプリケーションを実行します。 - SC_SIZE
- 0xF000
ウィンドウのサイズを設定します。 - SC_TASKLIST
- 0xF130
[スタート] メニューをアクティブにします。 - SC_VSCROLL
- 0xF070
垂直方向にスクロールします。 -
lParam
-
ウィンドウ メニュー コマンドをマウスで選択した場合、カーソルの水平方向の位置を画面座標で指定します。 それ以外の場合、このパラメーターは使用されません。
マウスでウィンドウ メニュー コマンドを選択した場合、高次ワードはカーソルの垂直方向の位置を画面座標で指定します。 このパラメーターは、システム アクセラレータを使用してコマンドを選択した場合は 1、ニーモニックを使用する場合は 0 です。
戻り値
このメッセージを処理する場合、アプリケーションは 0 を返す必要があります。
解説
画面座標の位置座標を取得するには、次のコードを使用します。
xPos = GET_X_LPARAM(lParam); // horizontal position
yPos = GET_Y_LPARAM(lParam); // vertical position
DefWindowProc 関数は、前の表で指定した定義済みのアクションに対してウィンドウ メニュー要求を実行します。
WM_SYSCOMMANDメッセージでは、wParam パラメーターの下位 4 ビットがシステムによって内部的に使用されます。 wParam の値をテストするときに正しい結果を取得するには、アプリケーションでビットごとの AND 演算子を使用して、0xFFF0値と wParam 値を組み合わせる必要があります。
ウィンドウ メニューのメニュー項目は、GetSystemMenu、AppendMenu、InsertMenu、ModifyMenu、InsertMenuItem、および SetMenuItemInfo 関数を使用して変更できます。 ウィンドウ メニューを変更するアプリケーションでは、 WM_SYSCOMMANDメッセージを 処理する必要があります。
アプリケーションは、WM_SYSCOMMAND メッセージをDefWindowProc に渡すことで、いつでも任意のシステム コマンドを実行できます。 アプリケーションによって処理されない WM_SYSCOMMAND メッセージは 、DefWindowProc に渡す必要があります。 アプリケーションによって追加されたコマンド値は、アプリケーションによって処理される必要があり、 DefWindowProc に渡すことはできません。
ポリシーによってパスワード保護が有効になっている場合、DefWindowProc に渡さない場合でも、SC_SCREENSAVE通知でアプリケーションが何を行うかに関係なく、スクリーン セーバーが開始されます。
ウィンドウ メニューから項目を選択するように定義されているアクセラレータ キーは、 WM_SYSCOMMAND メッセージに変換されます。その他のすべてのアクセラレータ キーストロークは、 WM_COMMAND メッセージに変換されます。
wParam がSC_KEYMENUの場合、lParam には、ポップアップ メニューを表示するために Alt キーと共に使用されるキーの文字コードが含まれます。 たとえば、Alt キーを押しながら F キーを押して [ファイル] ポップアップを表示すると、wParam が SC_KEYMENU、lParam が 'f' のWM_SYSCOMMANDが発生します。
必要条件
要件 | 値 |
---|---|
サポートされている最小のクライアント |
Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー |
Windows 2000 Server [デスクトップ アプリのみ] |
ヘッダー |
|