自動化,當且僅當連接了外部顯示器時,關閉筆記型電腦蓋子不會執行任何操作

自動化,當且僅當連接了外部顯示器時,關閉筆記型電腦蓋子不會執行任何操作

在閱讀全文之前,請不要標記為重複。我已閱讀其他帖子,但它們沒有解決我的問題。

我使用的是具有外接顯示器的筆記型電腦。連接顯示器後,我想合上蓋子而不執行任何操作。但是,當顯示器未連接時,我想合上蓋子以使筆記型電腦進入睡眠狀態。

我現在正在做的是,當我使用外部顯示器時,在我的設置中將“關閉蓋子”設置為“不執行任何操作”,並嘗試記住在斷開顯示器連接後將其設置回來。但我經常忘記,當我認為筆記型電腦已經進入睡眠狀態並耗盡電池電量時,我的筆記型電腦會持續打開幾個小時。

我已經使用了 autohotkey,因此如果有一個簡單的方法可以在 AutoHotkey 中檢測外部顯示器,那就可以開始了。然後我可以創建兩個電源計劃並在它們之間切換(這在 AutoHotkey 中可能嗎?)。

我已經嘗試過 sysget、MonitorCount 但這不起作用,因為當我只有外接顯示器和只有筆記型電腦顯示器時,顯示器的數量都是 1。

答案1

我不知道你的問題有什麼可靠的答案。但您可以嘗試以下幾件事:

  1. 在關閉筆記型電腦之前短暫插入筆記型電腦的電源。您可以將合上蓋子設定為在插入電源時不執行任何操作,但在未插入電源時休眠。將保持喚醒狀態。
  2. 打開筆記型電腦後立即關閉它。根據我的經驗,如果您在打開筆記型電腦後立即關閉筆記型電腦,它就不會進入睡眠狀態。 (可能是因為 Windows 尚未載入任何在您合上蓋子時告訴其進入睡眠狀態的進程。)
  3. 按快速鍵「[WIN]+X,U,S」進入睡眠當我合上蓋子時,我的一台電腦不會執行任何操作,只會關閉,因此我養成了使用睡眠快捷方式的習慣:按住 Windows 鍵並按「x」。放開,然後按住“u”和“s”鍵。一旦掌握了竅門,使用此快捷方式可能比進入開始功能表睡眠電腦更有效。

答案2

當然,基本上你可以在 AHK 中做任何事情。您可以建立計劃,截取您想要啟用的確切按鈕和位置的小螢幕截圖,然後編寫 AHK 腳本來開啟電源對話框,根據您的 png/jpg 搜尋該確切計劃,按一下它,然後關閉電源對話框。

這可能不是最好的選擇,但它是一個選擇。您可以查看計劃任務,因為我相信taskschd.msc有能力確定當前的電源計劃。

答案3

不是完整的答案,但也許有一些提示:

顯示器有名稱,例如,這是我用來透過使用工作列和快捷方式按需更改顯示器亮度的程式的螢幕截圖,稱為 ClickMonitorDDC:

顯示兩台連接的顯示器名稱的螢幕截圖:一台內建筆記型電腦和一台連接的戴爾顯示器。

螢幕截圖

這是我使用自動熱鍵發現的東西用於在 AutoHotKey 中尋找型號。

最後,這是有關透過 AutoHotKey 更改電源計劃的信息

答案4

注意:我不是自動熱鍵使用者。

這是我在以下位置找到的這個連結

#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
        }

相關內容