Windows でスクリーンセーバーを防止・回避する

はじめに

Windows10 のスクリーンセーバー(またはロック画面)を「Windows の設定変更なし」「追加ソフトウェアなし」「マウス・キー入力への悪影響なし」で防止・回避します。具体的には、PowerShell+移動量0のマウス移動イベントで実現します。

※想定しきれていない悪影響がありましたら、ご連絡いただければ幸いです。

コード

AvoidScreenSaver.bat@powershell -NoProfile -ExecutionPolicy Unrestricted "&([ScriptBlock]::Create((cat \"%~f0\" | ?{$_.ReadCount -gt 1}) -join \"`n\"))" %* & goto:eof
# 上記の記述は、batコマンドです。                                               #
# ファイルの先頭行を無視してPowerShellで実行します。そして処理を終了します。    #


# AvoidScreenSaver.ps1 v2.2                                                     #
# 移動量0のマウス移動イベントを周期的に発火してスクリーンセーバーを防止する。   #
# see https://www.bugbugnow.net/2020/10/avoid-screen-saver.html                 #
# see https://gist.github.com/k08045kk/80e46994762ae66d3a7f1219716f3ef6         #


# クラスの定義                                                                  #
# see https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event #
$Signature = @' 
  [DllImport("user32.dll")]
  public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@
$MouseEvent = Add-Type -MemberDefinition $Signature -Name "Win32MouseEvent" -Namespace Win32Functions -PassThru


echo "AvoidScreenSaver.ps1 started."
echo "[Ctrl+C] Press to exit."
while ($true) {
  # スリープ(50秒停止する)                                                    #
  Start-Sleep -s 50

  # 移動量0のマウス移動イベント(ロック画面・スクリーンセーバー・スリープ対策) #
  $MouseEvent::mouse_event(1, 0, 0, 0, 0)
}

変更履歴

日付バージョン備考
2020/10/03v1.0初版
2021/01/13v1.1UTF-8BOMなし対応(処理内の全角文字を半角文字に変更)
2021/02/05v2.0batファイル化
2021/03/01v2.1batコマンドを2行から1行に変更
2021/03/01v2.2Shift-JIS・LF改行対応(コメント行の末尾を半角文字に変更)

AvoidScreenSaver.bat - GitHub Gist

使い方(保存・起動・終了)

  • 保存する
    • 「ファイル名:AvoidScreenSaver.bat」「文字コード:UTF-8」で保存する
    • コピー・ペーストできない環境では、最悪紙に印刷して、手入力してください
      • 行頭が#で始まる行は、コメント行であるため、入力は不要です
      • 手入力する場合、事前にPowerShellの動作確認することをおすすめします
        • 環境によっては、PowerShellが動作しない可能性があります
  • 起動する
    • コマンドプロントから「powershell -NoProfile -ExecutionPolicy Unrestricted .\AvoidScreenSaver.ps1」で実行する
    • [保存したファイルを右クリック] > [PowerShellで実行] で実行する
    • AvoidScreenSaver.batをダブルクリックする
  • 終了する
    • 立ち上がった黒いウィンドウに対して [Ctrl+C] で終了する

※PowerShell は、Windows7 以降から標準搭載されています。
 PowerShell は、WindowsXP でも別途インストールすることで利用できます。
※PowerShell が無効化されている場合、本スクリプトは使用できません。
 セキュリティー的な理由で無効化されている可能性があります。
※自動起動することは可能ですが、ここでは取り扱いません。
 「スタートアップ」「タスクマネージャー」でググれば答えにたどり着けます。
※ウィンドウを非表示することは可能ですが、ここでは取り扱いません。
 「PowerShell ウィンドウ 非表示」あたりでググれば答えにたどり着けます。

別解

  • Microsoft PowerToys の Awake 機能を使用する
    • PowerToys を次の設定にする。
      • [Awake を有効にする] を [オン] にする
      • [画面をオンにしたままにする] を [オン] にする
    • PowerToys は、 Microsoft Store から無償でダウンロードできます。
  • Windows Media Player をミュートで連続再生し続ける
    • メディアプレーヤーは、再生中にスクリーンセーバーを表示しないオプションがデフォルトで設定されています。
  • Microsoft Power Point をスライドショーで表示し続ける
    • [リボン] > [スライドショー] > [スライドショー設定]
      • 種類の [出席者として参照する(ウィンドウ表示)] を設定する
      • フルスクリーンではなく、ウィンドウで表示できる
  • マウスを定期的に(左右に1ドット)移動させる
  • 「シフトキーやコントロールキーを定期的に押下する」スクリプトを使用する
    • 例:VBSを利用した自動的にスクリーンセーバーが起動しない対応
    • 悪影響:押下中のシフトキーをキャンセルされることがある
      • 例:[Shift+A] を押下し続けると、「AAA...」の入力が途中から「Aaa...」になる
    • 悪影響:ジョークプログラムとしてウイルス対策ソフトに検出されることがある
      • 筆者環境で上記リンク先のVBSコードが Windows Defender に検出されました
        • Joke:VBS/Trier.A
  • USBマウスムーバーを導入する
    • 小型の USBデバイスでマウスとして OS に認識させ、マウス移動を定期的に発生させる
    • 利点:USB接続が可能であれば、 OS などの環境を問わず簡易に導入できる
    • 悪影響:(製品によるが)マウスふるふる同様、作業中にマウスが勝手に動く

備考(スクリーンセーバーを無効化する)

  • スクリーンセーバー設定を変更する
    • [スタートメニュー] > [設定] > [個人設定] > [ロック画面] > [スクリーンセーバー設定]
    • [デスクトップを右クリック] > [個人設定] > [ロック画面] > [スクリーンセーバー設定]
    • [タスクバーの検索窓] で「スクリーンセーバー設定」と入力する
      • スクリーンセーバーの選択プルダウンを [なし] に設定する
      • [OK] 又は [適用] を選択する
  • ローカルグループポリシーを変更する
    • [スタートメニューを右クリック] > [ファイル名を指定して実行]
      • gpedit.msc」を入力する
      • ローカルグループポリシーエディター
        • [ローカルコンピューターポリシー] > [ユーザーの構成] > [管理用テンプレート] > [コントロールパネル] > [個人用設定] > [スクリーンセーバーを有効にする] を [無効] に設定する
  • レジストリを設定する
    • [スタートメニューを右クリック] > [ファイル名を指定して実行]
      • regedit」を入力する
      • レジストリーエディター
        • HKEY_CURRENT_USER\Control Panel\Desktop
          • 名前:ScreenSaveActive
          • 種類:REG_SZ
          • データ:0(無効)、1(有効)
          • 1→0に変更する

※グループポリシーやレジストリは、変更しないことをおすすめします。

参考