首页 > 解决方案 > 通过 WMI 查找所有显示器的所有可能的屏幕分辨率

问题描述

如何在 WMI 查询中执行此操作?

尝试首先直接在VideoModeDescriptor类上使用查询,但是只有在实例化时才能访问。所以尝试了InstancesOf,如下面的 AutoHotkey 片段:

Enabled := ComObjError(1)
wmi := ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\" A_ComputerName "\root\wmi")
Instances := wmi.InstancesOf("VideoModeDescriptor", 1)
  For Instance In Instances
  msgbox % Instance.CompositePolarityType ; e.g. test first element

没有成功,但是有可能与此处GetObject所述结合使用。所以查询WmiMonitorListedSupportedSourceModes的另一个选项是更好的方法,但是如何获取原始分辨率数据呢?

标签: vbscriptwmiautohotkeyscreen-resolutionwmi-query

解决方案


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 键值迭代产生空白 for monitor,并且代码因root\cimv2无效类错误而失败。即使在原始查询中未指定,也ExecQuery足够慷慨。 以下 vbscript 代码仅产生首选分辨率,但很容易将上述技术应用于所有这些:InstanceName

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

推荐阅读