автоматизировать так, чтобы при закрытии крышки ноутбука не происходило ничего, если подключен внешний монитор

автоматизировать так, чтобы при закрытии крышки ноутбука не происходило ничего, если подключен внешний монитор

Пожалуйста, не отмечайте как дубликат, пока не прочтете все. Я прочитал другие посты, и они не решают мою проблему.

Я использую ноутбук с внешним дисплеем. Когда дисплей подключен, я бы хотел, чтобы при закрытии крышки ничего не происходило. Однако, когда дисплей не подключен, я бы хотел, чтобы при закрытии крышки ноутбук переходил в спящий режим.

Сейчас я устанавливаю «закрыть крышку» на «ничего не делать» в настройках, когда использую внешний дисплей, и стараюсь не забыть вернуть его обратно, как только отсоединяю дисплей. Но я часто забываю, и тогда мой ноутбук остается включенным часами, когда я думаю, что он ушел в спящий режим, разряжая батарею.

Я уже использую 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:

Скриншот, показывающий названия двух подключенных мониторов: встроенного монитора ноутбука и подключенного монитора Dell.

Скриншот

Вотчто-то, что я нашел с помощью autohotkeyдля поиска номеров моделей в 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
        }

Связанный контент