2026/05/15(金)Windows 11でPowerShellを使って画面をオフにする方法

投稿日:

Win32APIをPowerShellから叩くことで実現できる。

確認環境

  • Windows 11 25H2 (OSビルド 26200.8457)

コード

(Add-Type -MemberDefinition @"
[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);
"@ -Name "Win32API" -PassThru)::SendMessage(0xFFFF, 0x0112, 0xF170, 2)

パラメーターを解説すると0xFFFFHWND_BROADCAST0x0112WM_SYSCOMMAND0xF170SC_MONITORPOWERに相当し、2はモニタ電源を落とす固定値である。

つまり内容としては第一引数のパラメーターがHWND_BROADCASTである場合、最上位のウィンドウにWM_SYSCOMMAND指令が出され、そのパラメーターはSC_MONITORPOWER2であるということで、つまりモニタ電源をオフにするシステムコマンドを最上位のウィンドウに送っている内容になっている。

-Name "Win32API" -PassThruを外したくなるが、外すとエラーで動かなくなるので付ける必要がある。

-PassThruがあることで戻り値が生まれ、-Name "Win32API"をつけることでクラスが生まれるらしい。

参考情報

  • SendMessage function (winuser.h) - Win32 apps | Microsoft Learn
    • > HWND_BROADCAST ((HWND)0xffff)
    • LRESULT SendMessage(
      [in] HWND hWnd,
      [in] UINT Msg,
      [in] WPARAM wParam,
      [in] LPARAM lParam
      );
  • WM_SYSCOMMAND message (Winuser.h) - Win32 apps | Microsoft Learn
    • > #define WM_SYSCOMMAND 0x0112
    • > SC_MONITORPOWER 0xF170
  • GET MONITOR STATE POWER ON OR OFF | Microsoft Learn
    • •-1 (the display is powering on)
      • 2 (the display is being shut off)
  • Add-Type (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Learn
    • -Name

      作成するクラスの名前を指定します。 このパラメーターは、メンバー定義から型を生成するときに必要です。

      型名と名前空間は、セッション内で一意である必要があります。 型をアンロードしたり、変更したりすることはできません。 型のコードを変更するには、名前を変更するか、新しい PowerShell セッションを開始する必要があります。 それ以外の場合、コマンドは失敗します。

    • -PassThru
      追加された型を表す System.Runtime オブジェクトを返します。 既定では、このコマンドレットは出力を生成しません。 OUTPUTAssembly 使用して DLL ファイルを作成し、新しく作成したアセンブリから型を返す場合は、このパラメーターを使用します。

あとがき

これは私物PCと業務PCでモニタを共有しており、排他制御で利用してる時に便利な技だ。

例えばリモートワークで昼休みに私物PCにスイッチする時で、業務PCをスリープや休止にするとWSLの中身が死んだりして面倒だが、画面オフならそういうことが起きないので便利に切り替えできるという訳。