【问题标题】:Find All Possible Screen Resolutions for All Monitors via WMI通过 WMI 查找所有显示器的所有可能的屏幕分辨率
【发布时间】:2021-12-09 16:51:04
【问题描述】:

如何在 WMI 查询中这样做?

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

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 一起使用,如here 所述。 所以查询WmiMonitorListedSupportedSourceModes 的另一种选择是更好的方法,但是如何获取原始分辨率数据呢?

【问题讨论】:

    标签: vbscript wmi autohotkey screen-resolution wmi-query


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2010-12-05
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多