Edited at

ディスプレイを強制的にスリープにする

More than 1 year has passed since last update.

夏は暑い。私事だが24インチディスプレイがLEDバックライトではない型なのでディスプレイ周辺が1段暑いように感じる。PC本体もそうだが、発熱源はできるだけ小まめに電源のON/OFFをしたいところ。


電源とスリープ

何分に設定するかはともかくとして、席を外した時にディスプレイをスリープにすることができるので、支障がなければ設定しておこう。

a2.png


Windows API 直呼び

稀に「10分間コンビニ行くので今すぐにディスプレイをスリープにしたい」と思うことがある。ディスプレイの電源ボタンを押してもいいのだが、マルチディスプレイ環境でデスクトップのアイコンの配置がぶっ飛んだりして…とにかくあまり良い思い出がない1。ディスプレイの電源をすぐにOFFにできるフリーソフトもいくつかあるようだが、私はあまりその手の(目的がちょっとした利便に関わるだけの)フリーソフトのバイナリはあまり信用したくない。ただAPIを呼ぶだけなのでPythonででっちあげたのがコレ。

# -*- Mode: python; tab-width: 4; indent-tabs-mode: nil; coding: utf-8; -*-


from ctypes import *

user32 = WinDLL('User32')
DISPLAY_ON = -1
DISPLAY_OFF = 2
HWND_BROADCAST = 0xffff
WM_SYSCOMMAND = 0x0112
SC_MONITORPOWER = 0xf170
post_message = cast(user32.PostMessageA,
CFUNCTYPE(c_uint32, c_uint32, c_uint32, c_uint32, c_uint32))
lock_workstation = cast(user32.LockWorkStation, CFUNCTYPE(c_uint32))

post_message(HWND_BROADCAST,
WM_SYSCOMMAND,
SC_MONITORPOWER,
DISPLAY_OFF)
# lock_workstation()

gist.

これをバッチファイルか何かで走らせるようにし、そのアイコンをクリックすることでディスプレイをスリープ状態にできる。電源管理のスリープと同じで、マウスを動かしたりキーボードを叩けば復帰する。

lock_workstation()のコメントアウトを外すと、ディスプレイをスリープにしつつロック状態になる。この状態では画面復帰後にパスワード入力などで認証し直す必要がある。


@asmさんによるPowerShell版

Pythonで実装しちゃったが、おそらくPowerShell + C#で、素の状態のWindows10で動くスクリプトも組めると思う。やる気が出たらそっちもやってみたい。あるいは誰かやってよ。

コメント欄に @asm さんによるPowerShell版の実装があるぞ! こちらの実装は素の状態のWindows10でも動く筈。


参考





  1. 電源ボタンでOFFにすると、復帰時も電源ボタンを押す必要がある...あまり大きな声で言いたくないが、復帰時にディスプレイではなくPC本体の電源をポチっとな、してしまったことが何度かあるので、そういう意味でも個人的に抵抗がある。あと物理ボタンは可動部品なので頻繁に押してると壊れやすいということもある。