WM_SYSCOMMAND メッセージ

ウィンドウは、ユーザーが [ウィンドウ ] メニュー (以前はシステムまたはコントロール メニュー) からコマンドを選択したとき、またはユーザーが最大化ボタン、最小化ボタン、復元ボタン、または閉じるボタンを選択したときに、このメッセージを受け取ります。

#define WM_SYSCOMMAND                   0x0112

 case WM_SYSCOMMAND:
        if (wParam == 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、AppendMenuInsertMenuModifyMenuInsertMenuItemおよび SetMenuItemInfo 関数を使用して変更できます。 ウィンドウ メニューを変更するアプリケーションでは、 WM_SYSCOMMANDメッセージを 処理する必要があります。

アプリケーションは、WM_SYSCOMMAND メッセージをDefWindowProc に渡すことで、いつでも任意のシステム コマンドを実行できます。 アプリケーションによって処理されない WM_SYSCOMMAND メッセージは 、DefWindowProc に渡す必要があります。 アプリケーションによって追加されたコマンド値は、アプリケーションによって処理される必要があり、 DefWindowProc に渡すことはできません。

ポリシーによってパスワード保護が有効になっている場合、DefWindowProc に渡さない場合でも、SC_SCREENSAVE通知でアプリケーションが何を行うかに関係なく、スクリーン セーバーが開始されます。

ウィンドウ メニューから項目を選択するように定義されているアクセラレータ キーは、 WM_SYSCOMMAND メッセージに変換されます。その他のすべてのアクセラレータ キーストロークは、 WM_COMMAND メッセージに変換されます。

wParamSC_KEYMENUの場合、lParam には、ポップアップ メニューを表示するために Alt キーと共に使用されるキーの文字コードが含まれます。 たとえば、Alt キーを押しながら F キーを押して [ファイル] ポップアップを表示すると、wParamSC_KEYMENUlParam が 'f' のWM_SYSCOMMANDが発生します。

必要条件

要件
サポートされている最小のクライアント
Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー
Windows 2000 Server [デスクトップ アプリのみ]
ヘッダー
Winuser.h (Windows.h を含む)

関連項目

参照

AppendMenu

DefWindowProc

GET_X_LPARAM

GET_Y_LPARAM

GetSystemMenu

InsertMenu

ModifyMenu

WM_COMMAND

概念

キーボード アクセラレータ