automatize para que, se e somente se o monitor externo estiver conectado, fechar a tampa do laptop não faça nada

automatize para que, se e somente se o monitor externo estiver conectado, fechar a tampa do laptop não faça nada

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:

  1. 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. )
  2. 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.)
  3. 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.

captura de tela

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
        }

informação relacionada