PowerShell脚本开发:如何获取当前已连接的活跃显示器数量
我明白你遇到的问题了——Get-CimInstance Win32_VideoController | Measure-Object | Select-Object -ExpandProperty Count(或者直接用.Count)统计的是系统中的视频控制器/显卡数量,甚至是显卡上的输出端口数,根本不是当前实际连接并活跃的显示器数量。这里有两种可靠的解决方法,帮你精准获取活跃显示器的数量:
方法1:使用Win32_DesktopMonitor类(直观易读)
这个WMI类专门针对桌面显示器,我们可以通过过滤Availability属性来筛选正在运行的活跃显示器:
# 获取所有活跃的桌面显示器 $activeDisplays = Get-CimInstance Win32_DesktopMonitor | Where-Object { # Availability值3=运行中,4=警告状态(仍在使用) $_.Availability -eq 3 -or $_.Availability -eq 4 } # 输出数量 Write-Host "当前活跃显示器数量:$($activeDisplays.Count)"
这种方法的好处是你还能顺便获取显示器的其他信息(比如分辨率、型号),如果后续需要扩展脚本功能会很方便。
方法2:调用Windows原生API(精准实时)
如果WMI的信息偶尔出现延迟或者不准确,可以直接调用user32.dll的系统API,它会直接返回当前桌面的活跃显示器数量:
# 导入User32.dll的API定义 Add-Type @" using System; using System.Runtime.InteropServices; public class DisplayHelper { [DllImport("user32.dll")] public static extern int GetSystemMetrics(int metricIndex); // SM_CMONITORS代表获取桌面显示器数量 public const int SM_CMONITORS = 80; } "@ # 获取活跃显示器数量 $monitorCount = [DisplayHelper]::GetSystemMetrics([DisplayHelper]::SM_CMONITORS) Write-Host "当前活跃显示器数量:$monitorCount"
这个方法返回的是当前桌面会话中实际使用的显示器数量,不会包含未连接的虚拟显示器或禁用的输出端口,精度非常高。
为什么之前的方法不行?
Win32_VideoController对应的是显卡硬件本身,一台独立显卡可能带有3-4个输出端口,但这些端口不一定都连接了显示器,所以它的.Count统计的是显卡/端口数,和实际使用的显示器数量完全不是一回事。
内容的提问来源于stack exchange,提问作者Ewan




