工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

自動画面ロック(スクリーンセーバー起動)を防止するスクリプト

概要

PowerShellを用いて、自動画面ロック(スクリーンセーバー起動)を防止するスクリプトを作成し、動作を確認した。


背景と目的

PC2台を同時に使用しているのだが、一方の作業中にもう一方のPCがロックしてしまい、ロック解除を1日に何回も行わなければならい状況に遭遇した。しかも、ロックまでの時間変更が許されない状況にある。そこで、ロックされないように、疑似的にキーを押すスクリプトを作成することにした。


詳細

0.使用条件

スクリプトを動かすためのいくつかの条件がある。 以下の条件をクリアするようにスクリプトを作成する。

  • PCに新たにプログラムを入れてはいけない
  • 管理者権限がなくても実行できる


1.仕様

PCに新たにソフトウェアを入れてはいけないため、PCにあらかじめ入っている環境を用いる必要がある。Windows10のPCを使用しているので候補となるのは、

などであるが、PowerShellをあまり使用したことがないので、ものは試しでPowerShellを用いることにする。

管理者権限がなくても使用できるかについては、

https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750

等を参考に、実行できる方法を用いる。


2.スクリプト作成

作成したスクリプトが以下。 基本的な動きとしては、

  • ロックまでの無操作時間に満たない一定時間、何もせず待つ
  • ユーザー操作によってマウス位置が変わっているか調べる
  • 変わっていなかったら、無操作と判断して、キーストロークを送り、無操作時間をリセットする
  • 変わっていたら、ユーザーが操作をしていると判断して、操作と干渉しないように、キーストロークは送らない

という感じ。

# アセンブリのロード
Add-Type -AssemblyName System.Windows.Forms

# マウス座標初期値
$px = [System.Windows.Forms.Cursor]::Position.X
$py = [System.Windows.Forms.Cursor]::Position.Y

while (1) {

    # 一定時間待つ
    Start-Sleep -s 60 * 3

    # マウスの座標を調べる
    $x = [System.Windows.Forms.Cursor]::Position.X
    $y = [System.Windows.Forms.Cursor]::Position.Y

    # 変わっていなかったらキーを押す
    if (($x -eq $px) -and ($y -eq $py)) {
        [System.Windows.Forms.SendKeys]::SendWait("%")

    }

    # マウス位置を記憶しておく
    $px = $x
    $py = $y

}

参考


3.動作確認

動作を確認したところ、時間を経過してもロックされずに済んだ。しかしながら、本来自動ロックはセキュリティのために設定しているものなので、PCの前を離れる場合は、自分でロックするようにする。


まとめと今後の課題

自動画面ロック(スクリーンセーバー起動)を防止するスクリプトを作成できた。ひとまずこれでロック解除回数が減らせそう。いずれは、在席センサなどを用いて、画面ロック動作を制御できると、手間も減ってセキュリティも確保できると思われる。