AHK 的完整解决方案是:
wmi := ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\" A_ComputerName "\root\wmi")
for monitor in wmi.ExecQuery("SELECT NumOfMonitorSourceModes, MonitorSourceModes FROM WmiMonitorListedSupportedSourceModes WHERE Active=TRUE",,wbemFlagForwardOnly := 32)
{
modes := ""
Loop, % monitor.NumOfMonitorSourceModes - 1
modes .= monitor.MonitorSourceModes[A_Index - 1].HorizontalActivePixels . " " . monitor.MonitorSourceModes[A_Index - 1].HorizontalImageSize . " "
msgbox % monitor.InstanceName . "`n" . modes
有趣的是,标准的For Each key, value 迭代为monitor 生成空白,而root\cimv2 的代码因无效类错误而失败。 ExecQuery 足以提供 InstanceName,即使在原始查询中未指定。
以下 vbscript 代码仅产生首选分辨率,但很容易将上述技术应用于所有这些:
strComputer = "."
strQuery = "SELECT PreferredMonitorSourceModeIndex, NumOfMonitorSourceModes, MonitorSourceModes " & _
"FROM WmiMonitorListedSupportedSourceModes"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\ROOT\WMI")
Set colItems = objWMIService.ExecQuery(strQuery, , 48)
For Each objItem In colItems
intIndex = objItem.PreferredMonitorSourceModeIndex
msgbox("NumOfMonitorSourceModes: " & objItem.NumOfMonitorSourceModes & _
Replace("\nInstanceName: ", "\n", vbLf) & objItem.InstanceName & _
Replace("\nHorizontal: ", "\n", vbLF) & objItem.MonitorSourceModes(intIndex).HorizontalActivePixels & _
Replace("\nVertical: ", "\n", vbLF) & objItem.MonitorSourceModes(objIintIndex).VerticalActivePixels)
Next