はじめに
寝るときはPCをシャットダウンさせて寝る人もいればスリープにして寝る人もいます。
では何か処理を待って寝るときはどうしたらよいでしょうか
もちろんシャットダウンなんかしたら処理は止まりますし、スリープにさせても同様です。
じゃあそのままモニターが煌々ときらめく中眠りにつけるかと言われるとまあ無理でしょう
windows君は優しいので操作が無かった場合は自動でモニターの電源を消してくれる機能がありますが些か精度が悪く、短い時間に設定するとちょっとした時間でもすぐに消えて不便です
物理的にモニターの電源を切るにしても2枚以上あると不便です
要は自分のタイミングで簡単に画面だけオフにしたいよねっていう話
結論
以下のコードを
新規作成→ショートカット→ショートカットの項目の場所に登録するだけ
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 -Command &{ #powershellをショートカットから呼び出してコマンドを実行
sleep 2; #2秒待つ(クリックした瞬間に画面が消えるのは困る)
sal o New-Object; #`New-Object`にエイリアス`O`を設定
$f='System.Windows.Forms'; #windowsフォームを操作するための名前空間`System.Windows.Forms`を指定する
Add-Type -AssemblyName $f; #指定した名前空間をスクリプトに取り込んで使用可能にする。
$m=(o "$f.Message")::Create((o "$f.Form").Handle,274,61808,2); #windowsのメッセージを作成(後述)
(o "$f.NativeWindow").DefWndProc([ref]$m); #`DefWndProc`メソッドを使ってシステムに送信
}
windowsにおけるウィンドウメッセージとは
簡単に説明するとwindowsとアプリケーションの通信を行う仕組みのこと
例えば、
- キーボード入力
- マウス操作
- レンダリング要求
などに対して動作するアプリケーションを構築できる
主なウィンドウメッセージ
ここに書く意味もあまりないと思うのですが申し訳程度に書いておきます
もっと詳しく知りたい方はこちらをどうぞ
メッセージコード | 内容 |
---|---|
WM_CREATE | ウィンドウが作成されたとき |
WM_DESTROY | ウィンドウが閉じられるとき |
WM_PAINT | ウィンドウが再描画されるとき |
WM_KEYDOWN | キーボードのキーが押されたとき |
WM_LBUTTONDOWN | マウスの左ボタンが押されたとき |
WM_SYSCOMMAND | システムコマンド(Ex.ウィンドウの閉じるボタン等) |
今回使用した値は以下の通り。
- 274 (0x112) : WM_SYSCOMMAND (システムコマンドを送信)
- 61808 (0xF170) : SC_MONITORPOWER (モニターの電源操作)
- 2 : SC_MONITORPOWERのパラメーター
- -1 : ディスプレイの電源をON
- 1 : ディスプレイを低電力状態に
- 2 : ディスプレイをOFF
最後に
アドカレ公開が予定より3時間遅れてしまいましたが許してください...
ちなみにshellスクリプトを組んだのはこれが初めてです(たぶん)