URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

定期的にScrollLockキーを入力するPowerShellスクリプト

 在宅勤務をするにあたっての最近のちょっとした困りごとですが、Windowsのロックがかかった後、アンロックしてもHDMI接続の外部ディスプレイが映らなくなる(No Signalになる)という現象にあっています。
 再起動すると解消するのですが、ちょっと休憩する度に再起動するのも面倒ですよね。あと、ロックは会社のポリシーで設定されているので、一般的な設定でロックやスクリーンセーバーを使わない設定にするのはNGです。
 世の中には「マウスふるふる」のようなフリーソフトもあるのですが、この手のソフトも無許可で入れていると情シスに注意されるし、許可を取るには理由も必要。

 そんなわけで、Windowsの標準機能で似たようなことをします。

 休憩の度に起動/停止する使い方だと結局使い忘れて再起動することになるので、常時起動させておくことにします。そうするとマウスを勝手に動かされるとかは困ります。
 そこで、ほとんどの場合に入力されても影響のない[ScrollLock]キーを定期的に打つことにしました。一応、Excelとかを使っているときにも影響ないように、[ScrollLock]キーは2回セットで入力します。
 他には邪魔にならないように起動したら最小化するようにしておく。

function Get-ConsoleWindowHandle { $Proc = Get-Process -Id $PID $i = 0 while ($Proc.MainWindowHandle -eq 0) { if ($i++ -gt 10) { return $null } $Proc = $Proc.Parent } return $Proc.MainWindowHandle } $Global:CONSOLE_HWND = Get-ConsoleWindowHandle if(-not ('Console.Window' -as [type])) { Add-Type -Name Window -Namespace Console -MemberDefinition ` @' [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); public static void Minimize(IntPtr hwnd) { SendMessage(hwnd, 0x0112, 0xF020, 0); } '@ } function Hide-ConsoleWindow { if ($Global:CONSOLE_HWND -and ($env:TERM_PROGRAM -ne "vscode")) { [Console.Window]::Minimize($Global:CONSOLE_HWND) } } Clear-Host echo "Keep-alive with Scroll Lock..." Hide-ConsoleWindow $WShell = New-Object -com "WScript.Shell" while ($true) { $WShell.sendkeys("{SCROLLLOCK}") Start-Sleep -Milliseconds 100 $WShell.sendkeys("{SCROLLLOCK}") Start-Sleep -Seconds 240 }

 こんな感じです。
 前半の"function ~"は起動したPowerShellコンソールを最小化するためのもの。後半の"while"で240秒ごとに[ScrollLock]キーを2回入力する動きを無限ループです。
 これをデスクトップとかに置いて、必要なとき(大抵は在宅勤務の始業時)に右クリックから「PowerShellで実行」しています。出勤とか外出時はロックしてほしいので使いません。

 そもそも変な問題の回避のためなので、PCの方をどうにかしたい。あと数ヶ月で自分の業務PCはリース更新時期なので、機種交換したいんですよね。希望が通るか否か…。

参考