会議の画面共有中や長時間のログ監視中に勝手にロックされるのを防ぎたい。ただし、不自然にマウスが動くのは避けたい——そんなニーズに向けて、公式寄りの方法→軽微なマウス微動→GUIツールの順で解説します。どれもカンタンに試せます。
注意:会社PCなどでは、GPO(グループポリシー)で強制ロックが義務付けられている場合があります。規定の回避はNGです。まずはIT管理者へ「プレゼンテーションモード」等の許可を相談しましょう。
以下を C:\Tools\KeepAwake-ETS.ps1 などに保存し、PowerShellで実行します。
# KeepAwake-ETS.ps1
Add-Type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
using System;
using System.Runtime.InteropServices;
[Flags]
public enum EXECUTION_STATE : uint {
ES_SYSTEM_REQUIRED = 0x00000001,
ES_DISPLAY_REQUIRED = 0x00000002,
ES_AWAYMODE_REQUIRED = 0x00000040,
ES_CONTINUOUS = 0x80000000
}
public static class Power {
[DllImport("kernel32.dll", SetLastError=true)]
public static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
}
"@
try {
# 画面&システムの待機を抑止(連続フラグ付き)
[Win32.NativeMethods+Power]::SetThreadExecutionState(
[Win32.NativeMethods+EXECUTION_STATE]::ES_CONTINUOUS `
-bor [Win32.NativeMethods+EXECUTION_STATE]::ES_SYSTEM_REQUIRED `
-bor [Win32.NativeMethods+EXECUTION_STATE]::ES_DISPLAY_REQUIRED
) | Out-Null
while ($true) {
Start-Sleep -Seconds (Get-Random -Minimum 45 -Maximum 75)
# 保険として定期更新
[Win32.NativeMethods+Power]::SetThreadExecutionState(
[Win32.NativeMethods+EXECUTION_STATE]::ES_CONTINUOUS `
-bor [Win32.NativeMethods+EXECUTION_STATE]::ES_SYSTEM_REQUIRED `
-bor [Win32.NativeMethods+EXECUTION_STATE]::ES_DISPLAY_REQUIRED
) | Out-Null
}
}
finally {
# 元に戻す
[Win32.NativeMethods+Power]::SetThreadExecutionState(
[Win32.NativeMethods+EXECUTION_STATE]::ES_CONTINUOUS
) | Out-Null
}
$p = "C:\Tools\KeepAwake-ETS.ps1" # スクリプト保存先
$act = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -WindowStyle Hidden -File `"$p`""
$trg = New-ScheduledTaskTrigger -AtLogOn
Register-ScheduledTask -TaskName "KeepAwake-ETS" -Action $act -Trigger $trg -Description "Keep display/system awake via SetThreadExecutionState"
メリット:不自然さゼロ/クリック誤作動なし
デメリット:GPO強制ロックがある環境では無効なことがある
アイドル時間を取得し、ロック前だけカーソルを1ドット動かしてすぐ戻すので、見た目の違和感を極小化できます。
# KeepAwake-Jiggle.ps1
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# GetLastInputInfo でアイドル時間(ms)取得
Add-Type @"
using System;
using System.Runtime.InteropServices;
public static class IdleTime {
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO {
public uint cbSize;
public uint dwTime;
}
[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
public static uint GetIdleMilliseconds() {
LASTINPUTINFO lii = new LASTINPUTINFO();
lii.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lii);
if (!GetLastInputInfo(ref lii)) return 0;
return (uint)Environment.TickCount - lii.dwTime;
}
}
"@
# ロックまでの秒数(例:5分=300秒)。環境に合わせて調整
$lockSeconds = 300
$marginSeconds = 15 # ロック予定の少し前に動かす
$minBackoffSec = 15
$maxBackoffSec = 30
while ($true) {
$idleSec = [math]::Floor([IdleTime]::GetIdleMilliseconds() / 1000.0)
if ($idleSec -ge ($lockSeconds - $marginSeconds)) {
$p = [System.Windows.Forms.Cursor]::Position
# 1px右へ
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point ($p.X + 1), $p.Y
Start-Sleep -Milliseconds (Get-Random -Minimum 35 -Maximum 90)
# 元に戻す
[System.Windows.Forms.Cursor]::Position = $p
# 微動後は少し長めに待機(ランダム化)
Start-Sleep -Seconds (Get-Random -Minimum 40 -Maximum 70)
}
else {
Start-Sleep -Seconds (Get-Random -Minimum $minBackoffSec -Maximum $maxBackoffSec)
}
}
自然に見せるコツ
注意:これもGPO強制ロックの前には無力なことがあります。
| シチュエーション | おすすめ |
|---|---|
| 不自然な動きは一切NG/公式寄りが良い | 方法①(API方式) |
| 方法①が環境制限で効かない/どうしてもマウスで回避 | 方法②(1px微動) |
| GUIで手早くON/OFFしたい | 方法③(PowerToys Awake) |
方法②なら $lockSeconds を実環境に合わせて調整。イラスト1枚から、テクスチャ付…