web-dev-qa-db-fra.com

Obtenir la résolution d'écran à l'aide de WMI/powershell sous Windows 7

J'utilise le script suivant pour obtenir la résolution d'écran dans Windows à l'aide de WMI. Le script fonctionne correctement lorsque l'ordinateur est en mode Paysage mais renvoie des valeurs incorrectes en mode Portrait. Fonctionne correctement dans XP et n’a pas essayé sous Vista. Quelqu'un peut-il confirmer qu'il s'agit d'un bogue dans Windows 7 WMI?.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_DesktopMonitor",,48) 
For Each objItem in colItems 
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "Win32_DesktopMonitor instance"
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "ScreenHeight: " & objItem.ScreenHeight
    Wscript.Echo "ScreenWidth: " & objItem.ScreenWidth
Next
14
user281693

Pour mémoire, le code PowerShell est:

Get-WmiObject -Class Win32_DesktopMonitor | Select-Object ScreenWidth,ScreenHeight

Je reçois les mêmes valeurs en mode Paysage ou en mode Portrait.

METTRE À JOUR:

Dans un environnement multi-moniteur, vous pouvez obtenir les informations pour tous les moniteurs avec:

PS> Add-Type -AssemblyName System.Windows.Forms
PS> [System.Windows.Forms.Screen]::AllScreens


BitsPerPixel : 32
Bounds       : {X=0,Y=0,Width=1280,Height=800}
DeviceName   : \\.\DISPLAY1
Primary      : True
WorkingArea  : {X=0,Y=0,Width=1280,Height=770}

BitsPerPixel : 32
Bounds       : {X=1280,Y=0,Width=1920,Height=1200}
DeviceName   : \\.\DISPLAY2
Primary      : False
WorkingArea  : {X=1280,Y=0,Width=1920,Height=1170}
29
Shay Levy

Vous pouvez l'obtenir à partir de la classe WMI Win32_VideoController. La propriété VideoModeDescription inclut la résolution de l'écran et la profondeur de couleur.

(Get-WmiObject -Class Win32_VideoController).VideoModeDescription;

Résultat

1600 x 900 x 4294967296 colors
9
Trevor Sullivan

Identique aux autres réponses, toutefois pour la cmd simple:

wmic path Win32_VideoController get VideoModeDescription

3

La réponse de @Shay Levy ci-dessus indique avec précision la largeur/hauteur qui était active au moment du lancement de la session Powershell. Si vous faites pivoter le moniteur après le lancement de PS, il continue à signaler les valeurs d'origine, désormais incorrectes.

Le SystemInformation La classe fournit un autre moyen d’obtenir une orientation et elle change dans la session PS en cours même si l’affichage est pivoté après le lancement de la session.

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.SystemInformation]::ScreenOrientation
Angle0

[System.Windows.Forms.SystemInformation]::PrimaryMonitorSize
IsEmpty                            Width                           Height
-------                            -----                           ------
False                              1680                             1050

Faire pivoter le moniteur, puis ...

[System.Windows.Forms.SystemInformation]::ScreenOrientation
Angle90

[System.Windows.Forms.SystemInformation]::PrimaryMonitorSize
IsEmpty                            Width                           Height
-------                            -----                           ------
False                              1050                             1680

https://msdn.Microsoft.com/en-us/library/system.windows.forms.systeminformation(v=vs.110).aspx

3
Clayton

C'est mon essai:

@echo off
Mode 45,3 & color 0A
Title Dislpay Resolution by Hackoo 2018
Set "WMIC_Command=wmic path Win32_VideoController get VideoModeDescription^,CurrentHorizontalResolution^,CurrentVerticalResolution /format:Value"
Set "H=CurrentHorizontalResolution"
Set "V=CurrentVerticalResolution"
Call :GetResolution %H% HorizontalResolution
Call :GetResolution %V% VerticalResolution
echo(
echo     Screen Resolution is : %HorizontalResolution% x %VerticalResolution%
pause>nul & Exit
::****************************************************
:GetResolution 
FOR /F "tokens=2 delims==" %%I IN (
  '%WMIC_Command% ^| find /I "%~1" 2^>^nul'
) DO FOR /F "delims=" %%A IN ("%%I") DO SET "%2=%%A"
Exit /b
::****************************************************
0
Hackoo