外部ディスプレイが接続されたときにスリープモードをオフにする

外部ディスプレイが接続されたときにスリープモードをオフにする

外部ディスプレイに接続しているときは、ラップトップを閉じてもスリープ状態にはなりません。外部ディスプレイに接続していないときは、ラップトップの蓋を閉じるとスリープ状態になるようにしたいです。
手動で電源設定を切り替えることで実現できることはわかっていますが、自動化したいです。何かアイデアはありますか? 外部ディスプレイの接続を追跡できますか?
Windows 10

答え1

  1. スリープ ボタンを有効にした電源設定と、無効にした電源設定の 2 つの電源設定を決定 (または必要に応じて作成) します。

  2. コマンドを使用して、powercfg /lこれらのスキームの GUID を決定します。

  3. AutoHotKey をインストールし、Windows を起動するたびにこの監視スクリプトを起動するように設定します。モニターが接続および切断されるたびに、AutoHotKey がスクリプトを実行し、電源スキームを切り替えます。

    OnMessage(0x219, "メッセージモニター")
    メッセージモニター(wParam, lParam, メッセージ)
    {
        (wParam = 7)の場合{
            実行、powercfg /s 381b4222-f694-41f0-9685-ff5bb260df2e
        } それ以外 {
            実行、powercfg /s 381b4222-0001-2222-3333-0000000000000
        }
        MsgBox は %wParam% と %lParam% をチェックし、%msg% でプログラムを実行するかどうかを決定します。
    }
    ;wParam: 7 lParam: 0 モニターが接続されています
    ;wParam: 32772 lParam: 8977536 は切断されている必要があります

重要:上記のコード内のサンプルGUIDを、手順で決定したGUIDに置き換えます。2

出典:

答え2

@miroxlav の解決策は私にはうまくいきませんでした。スクリプトを次のように変更しました。

  • 2つの省電力設定を作成する必要があります
  • AutoHotKey スクリプトは通常、起動時に実行されます。
  • キャッチされたイベントは少し異なります (WM_DISPLAYCHANGE)
  • メイン モニターのインスタンス名を、PowerShell の get-WmiObject またはデバイス マネージャーなどから特定する必要があります。
  • 電源構成 UUID もスクリプト内にハードコードされています。
    /*
       Please note that it is not sufficient to count the number of monitors because the
       main monitors goes off line when you close the lid.
       Which resets the count to... 1
       So instead, we just make our decision on the presence of a different monitor than the known
       main one (hardcoded id, SN is a poor criterion).
    */

    /*  
        Subscribe to windows event
        0x7E = WM_DISPLAYCHANGE
    */
    OnMessage(0x7E, "MsgMonitor")

    MsgMonitor(wParam, lParam, msg) {

    /* Sleep 2 sec because there is a delay before display is known to WMI */
    Sleep 2000

    /* default */
    strComputer := "."

    /* This is the one for my PC... */
    myMonitor := "DISPLAY\LGD056E\4&13419694&0&UID265988_0"

    objWMIService := ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\" . strComputer . "\root\wmi")
    colItems := objWMIService.ExecQuery("Select * FROM WMIMonitorID")._NewEnum

    hasExternal := false

    While colItems[objItem]
    if objItem.instanceName != myMonitor {
        hasExternal := True
    }

    if ( hasExternal ) {
        /* this is the power config that does not set laptop to sleep on lid closing */event
        Run, powercfg /s a48ebd52-0590-400d-b032-ac7f4302c0e1
    } Else {
        /* this instead is the power config that does set laptop to sleep on lid closing event */
        Run, powercfg /s 377a8558-bff4-4f51-ab43-626b1aa5a65f
    }

}

答え3

@miroxlav の解決策は機能しましたが、外部ディスプレイを取り外すと、元の電源設定に戻りません。私が実行した方法は次のとおりです。

  1. 蓋が閉じているときにスリープを無効にする電源プランを作成します。
  2. 蓋が閉じているときにスリープを無効にしない電源プランを作成します。
  3. AutoHotKeyをインストールする

メモ帳を開いて、以下のコードを貼り付けます。AHK として保存して実行します。

この自動ホットキー スクリプトは、モニター数とプライマリ モニターを検出します。モニター数が 1 より大きい場合は、電源設定を変更します。対応する電源設定を貼り付けることを忘れないでください。

これが機能する場合は、Win + R を押してスクリプトを入力し、そこに貼り付けることで、起動時にこのスクリプトを実行できますshell:startup

OnMessage(0x219, "MsgMonitor")
     MsgMonitor(wParam, lParam, msg)
     {

        SysGet, MonitorCount, MonitorCount
        SysGet, MonitorPrimary, MonitorPrimary

        count := 0
        Loop, %MonitorCount%
        {
            count++
        }

        IfLessOrEqual, count, 1
            Run, powercfg /s c7046c63-d4a3-4246-910c-c994cd704433 /* no external monitor power setting */
        Else
            Run, powercfg /s 3791f438-87b9-4243-89a1-00c797e02c84 /* external monitor connected */
     }

関連情報