Por favor, não marque como duplicado antes de ler tudo. Li os outros posts e eles não resolvem meu problema.
Estou usando um laptop com monitor externo. Quando o display estiver conectado, gostaria de fechar a tampa para não fazer nada. No entanto, quando a tela não estiver conectada, gostaria de fechar a tampa para fazer o laptop dormir.
O que estou fazendo agora é definir 'fechar a tampa' para 'não fazer nada' em minhas configurações quando estou usando o monitor externo e tentar lembrar de configurá-lo novamente assim que desconectar o monitor. Mas muitas vezes esqueço e meu laptop fica ligado por horas quando penso que ele entrou no modo de suspensão, descarregando a bateria.
Eu já uso o autohotkey, então se houver uma maneira simples de detectar um monitor externo no AutoHotkey, isso seria um começo. Então eu poderia criar dois planos de energia e alternar entre eles (isso é possível no AutoHotkey?).
Já tentei sysget, MonitorCount mas não funciona porque o número de monitores é 1 tanto quando tenho apenas o monitor externo quanto quando tenho apenas o monitor do laptop.
Responder1
Não conheço nenhuma resposta sólida para o seu problema. Mas existem algumas coisas que você pode tentar:
- Conectar brevemente o laptop antes de fechá-lo.Você pode configurar o fechamento da tampa para não fazer nada quando estiver conectado, mas dormir se não estiver conectado. Portanto, quando estiver usando o monitor, você pode conectar o laptop, fechar a tampa e desconectá-lo (o laptop permanecerá acordado. )
- Fechar o laptop logo após ligá-lo.Na minha experiência, se você fechar o laptop imediatamente após ligá-lo, ele não entrará no modo de suspensão. (Provavelmente porque o Windows ainda não carregou nenhum dos processos que o fazem dormir quando você fecha a tampa.)
- Pressionando a tecla de atalho "[WIN]+X,U,S" para dormirUm dos meus computadores não fará nada além de desligar quando eu fechar a tampa, então adquiri o hábito de usar o atalho de suspensão:Mantenha pressionada a tecla Windows e pressione “x”. Solte e pressione as teclas "u" e "s" sem mantê-las pressionadas.Depois de pegar o jeito, usar esse atalho pode ser muito mais eficiente do que entrar no menu Iniciar para suspender o computador.
Responder2
É claro que você pode fazer basicamente qualquer coisa no AHK. Você pode criar planos, capturar uma pequena captura de tela do botão exato e do local que deseja ativar e, em seguida, criar um script AHK para abrir a caixa de diálogo de energia, pesquisar o plano exato com base em seu png/jpg, clicar nele e fechar a caixa de diálogo de energia.
Esta pode não ser a melhor opção, mas é uma opção. Você pode examinar as tarefas agendadas, pois acredito que o taskchd.msc tem a capacidade de determinar o plano de energia atual.
Responder3
Não é uma resposta completa, mas talvez algumas dicas:
Os monitores têm nomes. Por exemplo, aqui está uma captura de tela de um programa que uso para alterar o brilho do monitor sob demanda usando a barra de tarefas e o shotcut chamado ClickMonitorDDC:
Uma captura de tela mostrando os nomes de dois monitores conectados: o laptop interno e um Dell conectado.
Aqui estáalgo que encontrei usando o autohotkeypara encontrar números de modelo no AutoHotKey.
E finalmente, aqui estáalgo sobre como mudar os planos de energia através do AutoHotKey.
Responder4
Nota: não sou um usuário do autohotkey.
Aqui está o que encontrei emesse link?
#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
}