2016-06-23 8 views
4

Я пытаюсь получить максимальное поддерживаемое разрешение обоих моих мониторов с помощью WMI (поскольку он будет частью VBScript) Я пробовал следующие команды WMI, но я либо получить неверный результат или получить информацию только для одного монитора.Получите максимальное поддерживаемое разрешение всех подключенных мониторов

C:\>wmic path win32_videocontroller get videomodedescription /format:list 
VideoModeDescription=1366 x 768 x 4294967296 colors 

C:\>wmic path win32_displaycontrollerconfiguration get videomode /format:list 
VideoMode=1024 by 768 pixels, True Color, 60 Hertz 

Согласно Настройки дисплея, мой ноутбук монитор 1366x768 ... Нет подсказкой, где WMI становится 1024x768 с. Кроме того, если я изменить разрешение моего ноутбука монитора Настройка дисплея в 800х600, я получаю это:

C:\>wmic path win32_videocontroller get videomodedescription 
VideoModeDescription=800 x 600 x 4294967296 colors 

Таким образом, команда, которая точно сообщает мое текущее разрешение не говорит мне, что мое максимальное разрешение. (Меня не волнует, если глухие конечные пользователи поворачивают свое разрешение вниз, я просто хочу знать, какое разрешение их монитор способен поддерживать.)

Как вы можете видеть, ни один из этих методов пока не показал мне никаких информация о внешнем мониторе я также подключил к своему ноутбуку. Если я использую Win32_DesktopMonitor, я получаю информацию о внешнем мониторе, но не о его разрешении.

C:\>wmic path win32_desktopmonitor get /format:list 

Availability=8 
Bandwidth= 
Caption=HP L1710 LCD Monitor 
ConfigManagerErrorCode=0 
ConfigManagerUserConfig=FALSE 
CreationClassName=Win32_DesktopMonitor 
Description=HP L1710 LCD Monitor 
DeviceID=DesktopMonitor1 
DisplayType= 
ErrorCleared= 
ErrorDescription= 
InstallDate= 
IsLocked= 
LastErrorCode= 
MonitorManufacturer=Hewlett-Packard 
MonitorType=HP L1710 LCD Monitor 
Name=HP L1710 LCD Monitor 
PixelsPerXLogicalInch=96 
PixelsPerYLogicalInch=96 
PNPDeviceID=DISPLAY\HWP26EB\4&298A3A3E&0&UID16843008 
PowerManagementCapabilities= 
PowerManagementSupported= 
ScreenHeight= 
ScreenWidth= 
Status=OK 
StatusInfo= 
SystemCreationClassName=Win32_ComputerSystem 

Итак, есть ли способ с помощью VBScript (либо с помощью WMI или нет), чтобы получить максимальное поддерживаемое разрешение каждого подключенного монитора?


Обновление: Я просто побежал это на удаленном компьютере, на котором пользователь имеет внешний монитор подключен непосредственно в свой ноутбук, в то время как шахта подключен к док-станции.

C:\>winrs -r:remotehostname wmic path win32_videocontroller get videomodedescription 

VideoModeDescription 
1920 x 1080 x 4294967296 colors 
1440 x 900 x 4294967296 colors 

Upated 2: Использование WMI Explorer Я нашел эту команду, которая отображает каждый поддерживаемый режим. Выход слишком длинный для публикации, но я включил вывод для одного поддерживаемого режима.

wmic /namespace:\\ROOT\WMI path WmiMonitorListedSupportedSourceModes get MonitorSourceModes /format:list 

__PATH= 
__NAMESPACE= 
__SERVER= 
__DERIVATION={} 
__PROPERTY_COUNT=28 
__RELPATH= 
__DYNASTY=VideoModeDescriptor 
__SUPERCLASS= 
__CLASS=VideoModeDescriptor 
__GENUS=2 
CompositePolarityType = 2 
HorizontalActivePixels = 1366 
HorizontalBlankingPixels = 160 
HorizontalBorder = 0 
HorizontalImageSize = 310 
HorizontalPolarityType = 1 
HorizontalRefreshRateDenominator = 763 
HorizontalRefreshRateNumerator = 24100000 
HorizontalSyncOffset = 48 
HorizontalSyncPulseWidth = 32 
IsInterlaced = False 
IsSerrationRequired = 2 
IsSyncOnRGB = 2 
Origin = 2 
PixelClockRate = 48200000 
StereoModeType = 0 
SyncSignalType = 3 
TimingType = 4 
VerticalActivePixels = 768 
VerticalBlankingPixels = 22 
VerticalBorder = 0 
VerticalImageSize = 174 
VerticalPolarityType = 1 
VerticalRefreshRateDenominator = 60277 
VerticalRefreshRateNumerator = 2410000 
VerticalSyncOffset = 3 
VerticalSyncPulseWidth = 5 
VideoStandardType = 0 

HorizontalActivePixels и VerticalActivePixels дать мне размеры я ищу. Существует два экземпляра класса WmiMonitorListedSupportedSourceModes, по одному для каждого монитора. Теперь вопрос заключается в том, как просмотреть массив MonitorSourceModes, чтобы найти максимальное разрешение для каждого экземпляра. :(


Для тех, кто ищет эквивалент VBScript к @TessellatingHeckler «s отличной PowerShell ответ:.

strComputer = "." 

strQuery = "SELECT PreferredMonitorSourceModeIndex, MonitorSourceModes " & _ 
      "FROM WmiMonitorListedSupportedSourceModes" 

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\ROOT\WMI") 
Set colItems = objWMIService.ExecQuery(strQuery, , 48) 

For Each objItem In colItems 
    intIndex = objItem.PreferredMonitorSourceModeIndex 
    Wscript.StdOut.WriteLine "InstanceName: " & _ 
     objItem.InstanceName 
    Wscript.StdOut.WriteLine "Horizontal: " & _ 
     objItem.MonitorSourceModes(intIndex).HorizontalActivePixels 
    Wscript.StdOut.WriteLine "Vertical: " & _ 
     objItem.MonitorSourceModes(objIintIndex).VerticalActivePixels 
    Wscript.StdOut.WriteLine "__________" 
Next 
+0

Из [здесь] (https://blogs.technet.microsoft.com/heyscriptingguy/2013/10/03/use-powershell-to-discover-multi-monitor- информация /) в комментариях - это запрос, в котором, по крайней мере, перечислены все мои мониторы: 'gwmi -Query 'выберите * из Win32_PnPEntity, где service =" monitor "'.Также работает как admin 'gwmi -N" root \ wmi "wmiMonitorID' перечисляет все мониторы. Класс WMI «WmiMonitorBasicDisplayParams» покажет максимальный размер изображения ... в сантиметрах. Я просто нашел класс в своем обновлении 2 с этих https://msdn.microsoft.com/en-us/library/windows/desktop/aa392707(v=vs.85).aspx (Edit: PowerShell в моем комментарии) – TessellatingHeckler

ответ

2

стягиваются из моего комментария и ваше обновление, версия PowerShell Что не то, что вы хотите, но ... спасибо, нет VBScript.

# WmiMonitorId gives the make/model details 
$IDs = gwmi -NameSpace "root\wmi" -Class WmiMonitorId 

# This gives the available resolutions 
$monitors = gwmi -N "root\wmi" -Class WmiMonitorListedSupportedSourceModes 


$results = foreach($monitor in $monitors) { 
    # Get the id for this monitor 
    $currentId = $IDs |? {$_.InstanceName -eq $Monitor.InstanceName} 

    # Sort the available modes by display area (width*height) 
    $sortedModes = $monitor.MonitorSourceModes | sort -property {$_.HorizontalActivePixels * $_.VerticalActivePixels} 
    $maxModes = $sortedModes | select @{N="MaxRes";E={"$($_.HorizontalActivePixels)x$($_.VerticalActivePixels)"}} 

    # Tidy output - convert [uint16[]] name value to text, and pick the max res 
    [pscustomobject]@{ 
     Name=($currentId.UserFriendlyName | % {[char]$_}) -join '' 
     Modes=($maxModes | select -last 1).MaxRes 
     YearOfManufacture=$currentId.YearOfManufacture 
     WeekOfManufacture=$currentId.WeekOfManufacture 
    } 
} 

$results 

(NB. требует запуска от имени администратора).

Пример вывода:

Name  MaxRes 
----  ---- 
HP xyz  1080x720 
HP abc  1920x1080 
+0

Его достаточно легко конвертировать в VBScript и выглядит практически идентично тому, что я только что успел собрать. Я никогда не выяснял одну простую командную строку для получения информации, но meh. – Tim

+0

btw, вы заметили, что класс WMIMonitorID дает вам серийный номер монитора? Это настигло меня! Кто знал, что кабель VGA/DVI/HDMI передал больше данных, чем чисто видеосигналы?!? – Tim

+0

@ Тим я этого не заметил. Я знал, что они могут передать некоторую идентифицирующую информацию - иначе как Windows сможет установить правильный драйвер? Но я изначально собирался ответить на ваш вопрос и сказать, что они не могут передавать данные разрешения, это было до драйвера (это все еще может быть, idk). Они используют https://en.wikipedia.org/wiki/Extended_Display_Identification_Data для связи. Возможно, не старый стиль VGA, а DVI и HDMI. – TessellatingHeckler