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

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

火山引擎 最新活动