Пожалуйста, не отмечайте как дубликат, пока не прочтете все. Я прочитал другие посты, и они не решают мою проблему.
Я использую ноутбук с внешним дисплеем. Когда дисплей подключен, я бы хотел, чтобы при закрытии крышки ничего не происходило. Однако, когда дисплей не подключен, я бы хотел, чтобы при закрытии крышки ноутбук переходил в спящий режим.
Сейчас я устанавливаю «закрыть крышку» на «ничего не делать» в настройках, когда использую внешний дисплей, и стараюсь не забыть вернуть его обратно, как только отсоединяю дисплей. Но я часто забываю, и тогда мой ноутбук остается включенным часами, когда я думаю, что он ушел в спящий режим, разряжая батарею.
Я уже использую autohotkey, так что если есть простой способ обнаружить внешний дисплей в AutoHotkey, это было бы началом. Затем я мог бы создать два плана питания и переключаться между ними (возможно ли это в AutoHotkey?).
Я уже пробовал sysget, MonitorCount, но это не работает, потому что количество мониторов равно 1 и когда у меня есть только внешний монитор, и когда у меня есть только монитор ноутбука.
решение1
Я не знаю точных ответов на вашу проблему. Но есть несколько вещей, которые вы можете попробовать:
- Кратковременно подключите ноутбук к сети, прежде чем закрыть его.Вы можете настроить закрытие крышки так, чтобы при подключении к сети ничего не происходило, а при отсутствии подключения переходило в спящий режим. Таким образом, когда вы используете монитор, вы можете подключить ноутбук, закрыть крышку, а затем отключить его (ноутбук останется в спящем режиме).
- Закрывайте ноутбук сразу после его включения.По моему опыту, если закрыть ноутбук сразу после включения, он не перейдет в спящий режим. (Вероятно, потому что Windows еще не загрузила ни один из процессов, которые заставляют его переходить в спящий режим при закрытии крышки.)
- Нажмите сочетание клавиш "[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
}