モニターの電源をオフにするアプリを開発していて、かなり簡単にまとめる事ができたので備忘録的な記事として投稿します。
スポンサーリンク
結局Win32API
この辺りの、オペレーティングシステム(Windows)機能になると.NETアセンブリでは用意されていなく、昔ながらのWin32APIでの呼び出しで解決できました。
また、モニターの電源関連の専用関数も容易されていないようで、SendMessage関数のパラメタ受け渡しでモニターの電源関連の処理をWindowsがしてくれます。
SendMessage関数
VC++での開発を離れてから、久しく使わなくなってしまいましたがWindowsに仕事をさせるための基礎中の基礎関数です。
LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
hWnd:1 つのウィンドウのハンドルを指定します。このウィンドウのウィンドウプロシージャがメッセージを受信します。HWND_BROADCAST を指定すると、この関数は、システム内のすべてのトップレベルウィンドウ(親を持たないウィンドウ)へメッセージを送信します。無効になっている所有されていないウィンドウ、不可視の所有されていないウィンドウ、オーバーラップされた(手前にほかのウィンドウがあって覆い隠されている)ウィンドウ、ポップアップウィンドウも送信先になります。子ウィンドウへはメッセージを送信しません。
Msg:送信するべきメッセージを指定します。
wParam:メッセージ特有の追加情報を指定します。
lParam:メッセージ特有の追加情報を指定します。
戻り値
メッセージ処理の結果が返ります。この戻り値の意味は、送信されたメッセージにより異なります。
このSendMessage関数に、Msg、WM_SYSCOMMAND(0x112)、wParamにSC_MONITORPOWER(0xf170) を受け渡し、lParamで電源オンとオフを切り替えることができます。
コードサンプル
クラス化するとこんな感じのコードになりました。
MonitorPower.cs
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace MonitorPower { class Monitor { const int SC_MONITORPOWER = 0xf170; const int WM_SYSCOMMAND = 0x112; [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] static extern IntPtr SendMessage(int hWnd, uint Msg, int wParam, int lParam); public static void PowerSave() { //省電力 SendMessage(-1, WM_SYSCOMMAND, SC_MONITORPOWER, 1); } public static void PowerOff() { //モニター停止 SendMessage(-1, WM_SYSCOMMAND, SC_MONITORPOWER, 2); } public static void PowerOn() { //モニター復帰 SendMessage(-1, WM_SYSCOMMAND, SC_MONITORPOWER, -1); } } }
実際に使う場合には、こんな感じで呼び出すことが出来ます。
MonitorPower.Monitor.PowerOff();
実際にコードを実行すると、lParamに2を指定するとモニターの電源が切れます。マウスやキーボードで復帰するのはWindows側がやってくれるので考慮することはありませんでした。
lParamに1を指定すると省電力になるとリファレンスにありますが省電力設定がないデスクトップで試してみましたが、何も起きませんでした。
オペレーティングシステムの処理をする場合には、今でもWin32APIは現役のようです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。