自动化,当且仅当连接了外接显示器时,关闭笔记本电脑盖不会执行任何操作

自动化,当且仅当连接了外接显示器时,关闭笔记本电脑盖不会执行任何操作

请不要在阅读完整篇文章之前将其标记为重复。我已阅读其他帖子,但它们无法解决我的问题。

我使用的是带外接显示器的笔记本电脑。当显示器连接时,我希望合上盖子不做任何操作。但是,当显示器未连接时,我希望合上盖子让笔记本电脑进入睡眠状态。

我现在的做法是,在使用外接显示器时,将“合上盖子”设置为“不执行任何操作”,并尽量记住在断开显示器连接后将其重新设置。但我经常忘记,然后我的笔记本电脑在我认为它已经进入睡眠状态时仍保持开机状态数小时,从而耗尽电池电量。

我已经使用 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 中查找型号。

最后,关于通过 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
        }

相关内容