2016-06-23 73 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 

根據顯示設置,我的筆記本電腦顯示器是1366×768 ...不知道哪裏WMI從得到1024×768。另外,如果我改變我的筆記本電腦顯示器的分辨率顯示設置爲800x600,我得到這個:

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 

更新過的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 

HorizontalActivePixelsVerticalActivePixels給我,我要找的尺寸。有兩個WmiMonitorListedSupportedSourceModes類的實例,每個顯示器一個。現在的問題是如何通過MonitorSourceModes數組來查找每個實例的最大分辨率。 :(


對於任何人尋找的VBScript相當於@TessellatingHeckler的優秀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'select * from Win32_PnPEntity where service =「monitor」''。也以管理員身份運行'gwmi -N「root \ wmi」wmiMonitorID'列出所有監視器。 WMI類「WmiMonitorBasicDisplayParams」將以釐米爲單位顯示最大圖像大小...。我只是從這些https://msdn.microsoft.com/en-us/library/windows/desktop/aa392707(v=vs.85).aspx(在我的評論中編輯:PowerShell)中找到更新2中的類。 – 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,並且看起來幾乎與我剛剛設法湊齊的相同。我從來沒有想出一個簡單的命令行來產生這些信息,但是嘿。 – Tim

+0

btw,你有沒有注意到WMIMonitorID類給你顯示器的序列號?那讓我很難過!誰知道VGA/DVI/HDMI電纜傳輸的數據比純視頻信號多? – Tim

+0

@Tim我沒注意到。我知道他們可以通過一些識別信息 - 其他Windows如何安裝正確的驅動程序?但我原本想回答你的問題,並說他們無法傳遞分辨率數據,這取決於驅動程序(它可能是idk)。他們使用https://en.wikipedia.org/wiki/Extended_Display_Identification_Data進行通信。也許不是舊的VGA風格,但DVI和HDMI。 – TessellatingHeckler

相關問題