You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

能否通过WMI获取未启用的笔记本内置显示器分辨率?

关于扩展坞模式下获取未启用内置显示器分辨率的问题

首先明确回答你的核心疑问:是的,WMI(包括Get-WmiObject或推荐的Get-CimInstance)确实只记录当前已连接且处于激活状态的显示器信息。像Win32_DesktopMonitorWin32_DisplayConfiguration这类WMI类,都是基于当前显示会话的活跃输出设备来枚举的,未启用的内置屏幕不会出现在它们的查询结果里。

那要获取未启用内置屏的分辨率,有几个可行的方案:

1. 调用Windows原生API:EnumDisplayDevices

Windows的EnumDisplayDevices API可以枚举所有连接到系统的显示设备,不管是否处于激活状态。你可以用PowerShell通过引入自定义.NET类型来调用这个API,示例代码如下:

Add-Type @"
using System;
using System.Runtime.InteropServices;

public class DisplayHelper {
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct DISPLAY_DEVICE {
        public int cb;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string DeviceName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceString;
        public int StateFlags;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceID;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceKey;
    }

    [DllImport("user32.dll")]
    public static extern bool EnumDisplayDevices(string lpDevice, uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags);
}
"@

$displayDevice = New-Object DisplayHelper+DISPLAY_DEVICE
$displayDevice.cb = [System.Runtime.InteropServices.Marshal]::SizeOf($displayDevice)
$deviceIndex = 0

while ([DisplayHelper]::EnumDisplayDevices($null, $deviceIndex, [ref]$displayDevice, 0)) {
    # 检查是否是已连接但未激活的设备(StateFlags 0x1表示已连接,0x2表示激活)
    if (($displayDevice.StateFlags -band 0x00000001) -and -not ($displayDevice.StateFlags -band 0x00000002)) {
        Write-Host "未启用设备名称: $($displayDevice.DeviceName)"
        Write-Host "设备描述: $($displayDevice.DeviceString)"
        # 可进一步调用EnumDisplaySettings API读取该设备支持的分辨率模式
    }
    $deviceIndex++
    $displayDevice = New-Object DisplayHelper+DISPLAY_DEVICE
    $displayDevice.cb = [System.Runtime.InteropServices.Marshal]::SizeOf($displayDevice)
}

这段代码会列出所有已连接但未激活的显示设备,你可以扩展调用EnumDisplaySettings API来读取该设备支持的分辨率参数。

2. 利用系统工具导出设备信息

  • dxdiag:运行dxdiag /t dxreport.txt,生成的报告文件里会包含所有连接的显示器信息(包括未启用的),在Display Devices章节能找到内置屏的原生分辨率。
  • 设备管理器命令行:使用pnputil /enum-devices /class Display /connected可以列出所有已连接的显示设备,再结合设备的EDID信息(存储了屏幕的硬件参数)就能解析出分辨率。

注意事项

部分笔记本在扩展坞模式下,内置屏幕可能被硬件层面禁用(比如BIOS设置或扩展坞的硬件逻辑),这种情况下即使API也无法读取到它的信息。但大多数现代笔记本只是系统层面禁用,上述方法都可以生效。

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

火山引擎 最新活动