スクリーンセーバー……駆逐してやる! PC から……一つ残らず!

スクリーンセーバー……駆逐してやる! PC から……一つ残らず!
目次

ありがた迷惑なスクリーンセーバー

最近,とある Windows PC を利用する機会があります。その PC では,3 分ほど無操作状態が続くとスクリーンセーバーが起動し,数秒後にロックされる設定になっています。この動作はセキュリティーの観点から有効になっているのでしょう。だた,別の PC と一緒にマルチタスクするときにしか使わないため,頻繁にスクリーンセーバーとご対面する羽目となり,煩わしさ感じるところが少々あります。

このような場合,スクリーンセーバーの設定を変えるのが一番手っ取り早く効果的な方法です。ところが,グループポリシーによって PC の設定を変えられないように制限されていました。さらに,残念ながらアプリの追加も制限されているため, PowerToys の Awake 機能や マウスふるふる などで対処することも叶いません。

もはや物理的にマウスやキーボードを操作し続けるしか解決策はないとばかり考えていたのですが,その PC でも PowerShell は普通に使えると気が付きました。つまり,定期的に無意味なキーを押下するなどして,スクリーンセーバーを妨げる(無操作状態を回避する)PowerShell スクリプトを書けば良さそうです。

コードと導入手順

以下がスクリーンセーバーを妨げる(無操作状態を回避する)PowerShell スクリプトのコードになります。Windows 10 のデフォルトでインストールされている PowerShell で正しく動作することを確認済みです。

# 約 1 分おきに Shift + F15 を押下するスクリプト

$wsh = New-Object -ComObject WScript.Shell
while (1) {
  $wsh.SendKeys("+{F15}") # Shift + F15 キーを押す
  Start-Sleep -seconds 60
}

メモ帳から上記のコードをコピーして貼り付けた後,拡張子を .ps1 として好きな場所に保存します。例えば,awake.ps1 と名付けてデスクトップに置くと分かりやすいかもしれません。

注意点として,通常 .ps1 ファイルを直接ダブルクリックしてもスクリプトは実行されません。そもそも PowerShell は Windows の詳細な設定を編集できるほどに多機能・高性能なため,容易に .ps1 ファイルを実行できない仕組みになっているのです。したがって,少しばかり工夫を凝らす必要があります。ここでは一番手軽と思われるショートカットを用いた方法を紹介します。1

まず,作成した .ps1 ファイル(先の例では awake.ps1)を右クリックして,ショートカットを作成します。続いて,出来上がったショートカットを右クリックしてプロパティーを開き,リンク先の先頭に以下の文字列を,そして直後に半角スペースを書き加えます。

powershell -WindowStyle Hidden -ExecutionPolicy RemoteSigned -File

最後に OK ボタンをクリックして,プロパティーを閉じます。これでショートカットをダブルクリックすると,先ほどの .ps1 ファイルを実行できます。実際は -WindowStyle Hidden オプションにより,バックグラウンドで動作するように設定しているため,PowerShell のウィンドウがすぐに消えるように見えるかもしれませんが,正しく動作しているはずです。

特定の時間帯だけスクリーンセーバーを無効化したい場合

上記のコードでは,起動中している限りずっとスクリーンセーバーを無効化することになります。これでも良いのですが,実際には特定の時間帯に起動したときに限りスクリーンセーバーを無効化したいケースもあるでしょう。次のようにコードを書けば実現可能です。

# 終了時刻まで残り何分かを取得する
function timer {
  param ($endTime)
  $start = [datetime](Get-Date -format "yyyy-MM-dd HH:mm:ss")
  $end = [datetime](Get-Date -format "yyyy-MM-dd") + $endTime

  return [Math]::Ceiling(($end - $start).TotalMinutes)
}

$wsh = New-Object -ComObject WScript.Shell

# 終了時刻を 12:00 とする場合の例。現在時刻が 12:00 以降であれば,何も実行されずに終了する
while ((timer("12:00")) -gt 0) {
  $wsh.SendKeys("+{F15}") # Shift + F15 キーを押す
  Start-Sleep -Seconds 60
}

もし終了時刻をより柔軟に設定したい場合は,キーボード入力を求めたり,別のファイルからデータを読み込ませたりする処理を追記してみてください。

参考


  1. Google 検索 すると,ほかにも色々なアイデアが見つけられます。 ↩︎