ディスプレイ消灯  バッチ

　自分で作ってみた後に web 検索したら、全然良いのが見つかったのでそっちを優先的に載せておきます()。

### バッチ版
　以下の方のサイトに記載されていたコードを紹介
**Tsutchii Blog（ツッチーブログ）：[2. PowerShellスクリプトのバッチファイルを使う方法（windows10/11共通）](https://tsutchii.com/display-off#index_id3)**
```bat:display-off.bat
powershell (Add-Type '[DllImport(\"user32.dll\")]^public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)
```
　末尾の `-1` について、４桁の１６進数では `0xFFFF = 65535 = -1` です。
　VBA では、
　 　`Const HWND_BROADCAST As Long = &HFFFF` ＝ `-1`
　 　`Const HWND_BROADCAST As Long = &HFFFF&` ＝ `65535`
　のように末尾に `&` を付けるとリテラルが Long 型として扱われるようになり、値が変わります。

### ショートカット版
　以下の方のサイトに記載されていたコードを紹介
**www-tacos：[PCの画面をオフにするショートカットつくってみた](https://qiita.com/www-tacos/items/c567e6f9b9c35797d0ab#%E4%BD%9C%E3%82%8A%E6%96%B9)**
```lnk:display-off.lnk
powershell -Command &{sleep 2;sal o New-Object;$f='System.Windows.Forms';Add-Type -AssemblyName $f;$m=(o \"$f.Message\")::Create((o \"$f.Form\").Handle,274,61808,2);(o \"$f.NativeWindow\").DefWndProc([ref]$m);}
```

```PowerShell:⇧のコードの中身
Add-Type -AssemblyName System.Windows.Forms

$m = (New-Object System.Windows.Forms.Message)::Create((New-Object System.Windows.Forms.Form).Handle,274,61808,2)

(New-Object System.Windows.Forms.NativeWindow).DefWndProc([ref]$m)
```

```cmd:試しにコマンドプロンプトで実行したいときは & に ^ を付与
powershell -Command ^&{sleep 2;sal o New-Object;$f='System.Windows.Forms';Add-Type -AssemblyName $f;$m=(o \"$f.Message\")::Create((o \"$f.Form\").Handle,274,61808,2);(o \"$f.NativeWindow\").DefWndProc([ref]$m);}
```

### 自分で作ったやつ
　※**一番煩雑** 
・**⇩** バッチファイル **⇩**
```bat:Shouto-.cmd
@PowerShell -NoProfile -ExecutionPolicy Bypass -Command . ^
"$([ScriptBlock]::Create($('Add-Type @"" ^
  :    using System; ^
  :    using System.Runtime.InteropServices; ^
  ^
  :    public class Win32_API { ^
  :        [DllImport(\"user32.dll\", CharSet = CharSet.Auto)] ^
  :        public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); ^
  ^
  :        public const long HWND_BROADCAST = 0xFFFFL; ^
  :        public const int WM_SYSCOMMAND = 0x0112; ^
  :        public const int SC_MONITORPOWER = 0xF170; ^
  :        public const int MONITOR_OFF = 2; ^
  :    } ^
  : """"@; ^
 : $hWnd, $Msg, $wParam, $lParam = [Win32_API]::HWND_BROADCAST, [Win32_API]::WM_SYSCOMMAND, [Win32_API]::SC_MONITORPOWER, [Win32_API]::MONITOR_OFF; ^
 : [Win32_API]::PostMessage($hWnd, $Msg, $wParam, $lParam);' -replace ' : ', \"`r`n\" )))"

::@PAUSE
EXIT
```

・**⇩** PowerShell でのコード **⇩**
```PowerShell:PowerShell
# Win32 API 関数の定義
Add-Type @"
    using System;
    using System.Runtime.InteropServices;

    public class Win32_API {
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        public const long HWND_BROADCAST = 0xFFFFL;   //65535
        public const int WM_SYSCOMMAND = 0x0112;      //274
        public const int SC_MONITORPOWER = 0xF170;    //61808
        public const int MONITOR_OFF = 2;
    }
"@

# C# では、int や long などの基本的なデータ型は、IntPtr 型に自動的に変換でき、
# 引数に指定する値が IntPtr であるべき場合、与えられた int や long のリテラルは、
# 自動的に適切な IntPtr 型に変換される。
$hWnd,$Msg,$wParam,$lParam = [Win32_API]::HWND_BROADCAST,[Win32_API]::WM_SYSCOMMAND,[Win32_API]::SC_MONITORPOWER,[Win32_API]::MONITOR_OFF

# 非同期でディスプレイを消灯する
[Win32_API]::PostMessage($hWnd, $Msg, $wParam, $lParam)
```