将双显示器 Windows 系统的一个显示器置于待机状态

将双显示器 Windows 系统的一个显示器置于待机状态

待机未禁用!
在 Windows 7 或 Windows XP 上运行 2 个显示器时,我希望能够一次将其中一个显示器置于待机状态。方法可以是手动的。

当运行 2 个显示器时,第二个显示器并不总是需要的,关闭显示器自身的电源开关将关闭显示器,这样确实可以正常工作。但问题是,打开显示器徽标时会延迟,电源开关不太方便,开关可能无法永久使用,需要反复打开和关闭。

使用 devcon、WIN-P 和 Display 等禁用方法会导致所有窗口正确移动到另一台显示器。虽然这是人们希望发生的事情,以便他们能够掌握窗口,但这不是我想要发生的事情,而且另一台显示器上的某些东西在重新启用后必须重新排列。通过将其置于待机模式,除了显示器进入待机状态外,没有任何变化。

断开 DVI 电缆仍会导致系统(正确地)将所有窗口移至一个显示器,就像任何禁用方法一样。这会使窗口变得一团糟,这是不可接受的,我宁愿让显示器保持打开状态,浪费电力和硬件,而它很容易进入待机状态一段时间。

对于两个显示器,我使用一个“MonitorOff”程序将两个显示器都置于待机状态,但我找不到一个可以让 Windows 系统只有一个显示器处于待机状态的实用程序。

如果有人过来建议使用“ultramon”,那么你必须知道,它会让其中一台显示器进入待机状态。而且我不太适合使用 ultramon,我测试过它(它很好),但我觉得这不是我想要的程序。

2 个显示器均由 ATI 4890 卡运行,它们都连接了 DVI-I,操作系统都是 Windows 7(主要)和 Windows XP。

此外,拥有单独的待机活动计时器并遵循鼠标类型的待机变化也很有趣,但任何手动方法、快捷方式、批处理、托盘或小工具类型的操作都是一个良好的开端。

答案1

这可能不是您想要的,但一个潜在的黑客解决方案是通过 KVM 开关连接您的显示器,然后简单地将视频输入切换到非活动输入。KVM 开关的设计周期往往比电源开关更高,如果需要,您可以随时用您知道额定周期为数百万次的开关组件替换开关组件。

对于计算机/Windows 来说,这就像显示器被关闭或拔掉电源一样。由于没有接收到信号,显示器应该进入睡眠模式。

否则,请查找或编写一个 ACPI 工具,让您手动向设备发送 ACPI 信号。可能是一个潜在的起点。

答案2

我找到了这个问题的几个答案(通过命令关闭 Windows 中的显示) 接近我所想的。

唯一的问题是它们没有描述如何自动化这个过程,它使您能够在运行脚本时使单个监视器休眠以及如何重新打开它,但它没有告诉您如何让所有这些发生在您描述的事件上。

本网站(关闭液晶显示屏) 谈到创建一个利用的程序,System.Runtime.InteropServices 我想您可以创建一个 Windows 服务,该服务将在其中一个监视器不活动时进入睡眠状态,然后在出现鼠标事件时唤醒它。

如果我承担这项任务我认为我可以实现它。

已接受的挑战

答案3

我也需要这样的功能来节省笔记本电脑的电池电量。然而,事实证明,通过常规方式实现这一点出奇地困难。因此,我求助于 autohotkey,事实证明,它基本上可以做任何事情。

autohotkey 论坛上的帖子

对我有用的脚本:

Process, Priority,, B
Gui,2:-Caption +ToolWindow +AlwaysOnTop
Gui,2:Color, 0

SetTimer, Check, 250 ; checks idle status every 250 ms (modify this)

Check:
last := idle, idle := A_TimeIdlePhysical > 2000 ; 2000 ms idle time engages idle mode (selected so short for testing purposes)
If (idle = last)
 Return
If idle {
 AdjustScreenBrightness(-100) ; minumum brightness value for laptops (might change based on manufacturer and model etc)
 Gui,2:Show, Maximize ; blacks overlay over screen
} Else {
 AdjustScreenBrightness(70)
 Gui,2:Hide ; removes black overlay
}
Return

AdjustScreenBrightness(step) {
    service := "winmgmts:{impersonationLevel=impersonate}!\\.\root\WMI"
    monitors := ComObjGet(service).ExecQuery("SELECT * FROM WmiMonitorBrightness WHERE Active=TRUE")
    monMethods := ComObjGet(service).ExecQuery("SELECT * FROM wmiMonitorBrightNessMethods WHERE Active=TRUE")
    minBrightness := 0  ; level below this is identical to this

    for i in monitors {
        curt := i.CurrentBrightness
        break
    }
    if (curt < minBrightness)  ; parenthesis is necessary here
        curt := minBrightness
    toSet := curt + step
    if (toSet > 100)
        return
    if (toSet < minBrightness)
        toSet := minBrightness
        
    

    for i in monMethods {
        i.WmiSetBrightness(1, toSet)
        break
    }
}

此处显示的亮度功能仅适用于笔记本电脑,但也可以修改台式机屏幕的显示亮度。

这不是问题的确切解决方案,但我相信它提供了一个非常好的起点。我在这里发布它是因为在不同的平台上我看到人们抱怨他们的笔记本电脑的显示待机模式不能按预期工作。在我看来,这令人满意。

相关内容