外部モニターが接続されている場合にのみ、ノートパソコンの蓋を閉じても何も起こらないように自動化する

外部モニターが接続されている場合にのみ、ノートパソコンの蓋を閉じても何も起こらないように自動化する

全体を読む前に重複としてマークしないでください。他の投稿を読みましたが、問題は解決されませんでした。

外付けディスプレイ付きのノートパソコンを使用しています。ディスプレイが接続されているときは、蓋を閉じても何も起こらないようにしたいのですが、ディスプレイが接続されていないときは、蓋を閉じるとノートパソコンがスリープ状態になるようにしたいのですが。

私が今やっていることは、外部ディスプレイを使用しているときに設定で「カバーを閉じる」を「何もしない」に設定し、ディスプレイを取り外したら元に戻すことを忘れないようにすることです。しかし、私はよく忘れてしまい、ノートパソコンがスリープ状態になったと思っても何時間もオンのままになり、バッテリーを消耗してしまいます。

私はすでに autohotkey を使用しているので、AutoHotkey で外部ディスプレイを検出する簡単な方法があれば、それが第一歩になるでしょう。そうすれば、2 つの電源プランを作成して、それらを切り替えることができます (AutoHotkey でそれが可能でしょうか?)。

すでに sysget、MonitorCount を試しましたが、外部モニターのみの場合とラップトップ モニターのみの場合の両方でモニターの数が 1 であるため機能しません。

答え1

あなたの問題に対する確かな答えはわかりません。しかし、試すことができることがいくつかあります:

  1. ノートパソコンを閉じる前に、電源プラグを短時間差し込みます。プラグが差し込まれているときは蓋を閉じても何も起こらないように設定し、プラグが差し込まれていないときはスリープ状態にすることができます。つまり、モニターを使用しているときに、ラップトップをプラグに差し込み、蓋を閉じてからプラグを抜くことができます (ラップトップは起動したままになります)。
  2. ノートパソコンの電源を入れた直後に閉じる。私の経験では、ノートパソコンの電源を入れた直後に閉じると、スリープ状態になりません。(おそらく、蓋を閉じたときにスリープするように指示するプロセスが Windows にまだ読み込まれていないためです。)
  3. ショートカットキー「[WIN]+X,U,S」を押してスリープ状態にする私のコンピューターの 1 台は、蓋を閉じるとシャットダウンする以外は何もしないので、スリープ ショートカットを使用する習慣がつきました。Windows キーを押したまま「x」キーを押します。キーを放し、次に押したままにせずに「u」キーと「s」キーを押します。一度コツをつかめば、このショートカットを使用すると、スタート メニューからコンピューターをスリープ状態にするよりもはるかに効率的になります。

答え2

もちろん、AHK では基本的に何でもできます。プランを作成し、有効にしたいボタンと場所の小さなスクリーンショットを切り取り、AHK スクリプトを記述して電源ダイアログを開き、png/jpg に基づいてそのプランを検索し、それをクリックして電源ダイアログを閉じることができます。

これは最良の選択肢ではないかもしれませんが、選択肢の 1 つです。taskschd.msc には現在の電源プランを判別する機能があると思われるので、スケジュールされたタスクを調べてみてください。

答え3

完全な回答ではありませんが、おそらくいくつかのヒントがあります:

モニターには名前があります。たとえば、以下は、タスクバーとショットカットを使用してモニターの明るさをオンデマンドで変更するために使用する ClickMonitorDDC というプログラムのスクリーンショットです。

接続されている 2 つのモニターの名前を示すスクリーンショット: ラップトップの内部モニターと接続されている Dell モニター。

スクリーンショット

ここはオートホットキーを使って見つけたものAutoHotKey でモデル番号を見つけるため。

そして最後に、AutoHotKey による電源プランの変更について

答え4

注: 私は AutoHotkey ユーザーではありません。

私が見つけたものは次のとおりですこのリンク?

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#SingleInstance force

; Defines getMonitorInputSource
; Finds monitor handle
getMonitorHandle()
{
  ; Initialize Monitor handle
  hMon := DllCall("MonitorFromPoint"
    , "int64", 0 ; point on monitor
    , "uint", 1) ; flag to return primary monitor on failure

    
  ; Get Physical Monitor from handle
  VarSetCapacity(Physical_Monitor, 8 + 256, 0)

  DllCall("dxva2\GetPhysicalMonitorsFromHMONITOR"
    , "int", hMon   ; monitor handle
    , "uint", 1   ; monitor array size
    , "int", &Physical_Monitor)   ; point to array with monitor

  return hPhysMon := NumGet(Physical_Monitor)
}

destroyMonitorHandle(handle)
{
  DllCall("dxva2\DestroyPhysicalMonitor", "int", handle)
}

getMonitorInputSource()
{
  handle := getMonitorHandle()
  DllCall("dxva2\GetVCPFeatureAndVCPFeatureReply"
    , "int", handle
    , "char", 0x60 ;VCP code for Input Source Select
    , "Ptr", 0
    , "uint*", currentValue
    , "uint*", maximumValue)
  destroyMonitorHandle(handle)
  return currentValue
}

MouseLock := False

!+l::
    If (!MouseLock && getMonitorInputSource() == 4) {
        MouseLock := True
        BlockInput, MouseMove
        return
        }

    Else {
        MouseLock := False
        BlockInput, MouseMoveOff
        return
        }

#If (getMonitorInputSource() == 4 && !MouseLock)
XButton2::
    If (!WinExist("ahk_exe Magnify.exe")) {
        Send, #=
        return
        }
    If (WinExist("ahk_exe Magnify.exe")) {
        Send, #{Esc}
        return
        }

#If (getMonitorInputSource() == 4 && MouseLock)
XButton2::
    If (!WinExist("ahk_exe Magnify.exe")) {
        Send, #=
        BlockInput, MouseMoveOff
        return
        }
    If (WinExist("ahk_exe Magnify.exe")) {
        Send, #{Esc}
        BlockInput, MouseMove
        return
        }

関連情報