能否通过WMI获取未启用的笔记本内置显示器分辨率?
关于扩展坞模式下获取未启用内置显示器分辨率的问题
首先明确回答你的核心疑问:是的,WMI(包括Get-WmiObject或推荐的Get-CimInstance)确实只记录当前已连接且处于激活状态的显示器信息。像Win32_DesktopMonitor、Win32_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




