Windowsのロックを“自然に”防ぐ3つの方法(PowerShellサンプル付き)

雑記

会議の画面共有中や長時間のログ監視中に勝手にロックされるのを防ぎたい。ただし、不自然にマウスが動くのは避けたい——そんなニーズに向けて、公式寄りの方法軽微なマウス微動GUIツールの順で解説します。どれもカンタンに試せます。


結論(最初に)

  • 最優先:OSに「起きてて」と伝える 公式API方式(マウスは動かさない=不自然さゼロ)
  • それが効かない環境なら:アイドル直前だけ1px移動する 最小限マウス微動
  • ツール派なら:Microsoft PowerToys – Awake(GUIでオン/オフ)

注意:会社PCなどでは、GPO(グループポリシー)で強制ロックが義務付けられている場合があります。規定の回避はNGです。まずはIT管理者へ「プレゼンテーションモード」等の許可を相談しましょう。


方法①:公式APIで画面消灯・スリープを抑止(マウスは動かさない)

使い方

以下を 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強制ロックがある環境では無効なことがある


方法②:最小限の“自然な”マウス微動(アイドル直前に1px往復)

アイドル時間を取得し、ロック前だけカーソルを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)
    }
}

自然に見せるコツ

  • 常時動かさないアイドル直前だけ1px往復)
  • タイミングはランダム化(人の揺れに近い)
  • クリックしない(ホバーやフォーカスの影響も最小)

注意:これもGPO強制ロックの前には無力なことがあります。


方法③:PowerToys「Awake」を使う(クリック不要のGUI)

  • Microsoft製ツール「PowerToys」に含まれる Awake をオンにすると、画面オン/スリープ抑止をGUIで切替できます。
  • タスクトレイからトグル操作でき、作業が終わったらワンクリックでオフに戻せます。
  • スクリプト不要&不自然なマウス移動なし。
    ※ 企業PCではインストール可否やストア制限がある場合は管理者にご確認を。

どれを選べばいい?

シチュエーションおすすめ
不自然な動きは一切NG/公式寄りが良い方法①(API方式)
方法①が環境制限で効かない/どうしてもマウスで回避方法②(1px微動)
GUIで手早くON/OFFしたい方法③(PowerToys Awake)

トラブルシューティング

  • すぐロックする
    • 会社PCの場合はGPOによる強制ロックの可能性。管理者に相談。
    • 方法②なら $lockSeconds を実環境に合わせて調整。
  • マウスが動いて作業に影響する
    • 移動量は1px固定、クリックはしない構成に。
    • 微動タイミングを増やしすぎない。
  • スクリプトを常駐させたい
    • タスクスケジューラでログオン時自動起動に設定(方法①の例を流用)。

まとめ

  • 最も自然なのは「公式API(SetThreadExecutionState)」での抑止。
  • ダメなら「アイドル直前だけ1px微動」で“気づかれない程度”に。
  • ツール派は「PowerToys – Awake」が早い。
  • 組織ポリシーがある場合は必ず許可を得ること。

コメント

タイトルとURLをコピーしました