You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows系统下如何关闭显示器或将其设置为完全黑屏状态

Windows 实现本地显示器强制黑屏方案

免驱动方案

方案1:全屏顶层黑色遮挡窗口

这是兼容性最高的实现方案,逻辑如下:

  • 创建带有WS_EX_TOPMOST、WS_EX_TOOLWINDOW、WS_EX_TRANSPARENT扩展属性的无边框窗口,覆盖所有显示设备的全部显示区域
  • 窗口背景设置为纯黑,透明度拉满,同时禁用窗口的鼠标键盘事件透传,直接把所有输入事件拦截到窗口自身处理,不会触发系统的输入唤醒逻辑
  • 可额外注册全局低级别鼠标/键盘钩子,拦截所有非白名单输入(比如你自己的远程控制输入),彻底避免误触唤醒
    如果需要屏蔽Ctrl+Alt+Del这类系统级快捷键,可以搭配组策略禁用该快捷键,或者叠加下文的伪屏方案使用。

方案2:调用Win10+可用的显示配置API强制禁用物理输出

使用SetDisplayConfigAPI直接关闭指定显示输出,不会因为输入自动唤醒,实现代码示例:

#include <windows.h>
#include <winuser.h>
#pragma comment(lib, "user32.lib")

// 关闭所有物理显示输出
BOOL DisableAllPhysicalDisplays() {
    UINT32 pathCount = 0, modeCount = 0;
    // 先获取当前显示配置的路径和模式数量
    LONG res = GetDisplayConfigBufferSizes(QDC_ALL_PATHS, &pathCount, &modeCount);
    if (res != ERROR_SUCCESS) return FALSE;
    
    DISPLAYCONFIG_PATH_INFO* paths = new DISPLAYCONFIG_PATH_INFO[pathCount];
    DISPLAYCONFIG_MODE_INFO* modes = new DISPLAYCONFIG_MODE_INFO[modeCount];
    res = QueryDisplayConfig(QDC_ALL_PATHS, &pathCount, paths, &modeCount, modes, NULL);
    if (res != ERROR_SUCCESS) {
        delete[] paths;
        delete[] modes;
        return FALSE;
    }
    
    // 遍历所有显示路径,将激活的输出设置为关闭
    for (UINT32 i = 0; i < pathCount; i++) {
        if (paths[i].targetInfo.targetAvailable && paths[i].flags & DISPLAYCONFIG_PATH_ACTIVE) {
            paths[i].targetInfo.outputTechnology = DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER;
            paths[i].flags &= ~DISPLAYCONFIG_PATH_ACTIVE;
        }
    }
    
    res = SetDisplayConfig(pathCount, paths, modeCount, modes, SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_SAVE_TO_DATABASE);
    delete[] paths;
    delete[] modes;
    return res == ERROR_SUCCESS;
}

// 恢复显示输出时直接调用即可
BOOL RestoreDisplays() {
    return SetDisplayConfig(0, NULL, 0, NULL, SDC_APPLY | SDC_USE_DATABASE_CURRENT) == ERROR_SUCCESS;
}

该方案优势:直接操作显示输出配置,和系统显示设置的「断开此显示器」逻辑完全一致,不会因为鼠标键盘输入自动唤醒,兼容Win10 1709及以上所有版本,不需要额外驱动。

驱动级方案

如果上述方案都不能满足需求,可以采用WDF过滤驱动方案:

  • 挂接到显示微型端口驱动的设备栈上,拦截DxgkDdiCommitVidPn回调,直接修改VidPN配置将物理输出关闭,或者强制把输出的像素流全部替换为黑色
  • 该方案可以实现硬件级黑屏,任何上层软件都无法绕过,也不会响应任何输入唤醒,需要数字签名后才能在正常模式的Windows系统上运行,测试模式下可以关闭签名验证使用。

你之前调用DeviceIoControl返回无效函数错误,是因为调用的IOCTL对应的设备对象不是支持亮度调节的显示驱动设备,大部分台式机外接显示器如果没有通过DDC/CI协议支持亮度调节,系统不会暴露对应的控制接口,调用自然会失败。


内容的提问来源于stack exchange,提问作者H4k4nn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 19:12:03