Reputation: 635
I am using the following script to get screen resolution in Windows using WMI. The script works fine when the computer is in landscape mode but returns incorrect values when in portrait mode. Works properly in XP and did not try in Vista. Can anyone confirm this is bug in 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
Upvotes: 24
Views: 103435
Reputation: 441
For Short, this gets you the first screen (if you have many) width and height separately
$height = (((Get-WmiObject -Class Win32_VideoController).VideoModeDescription -split '\n')[0] -split ' ')[2]
$width = (((Get-WmiObject -Class Win32_VideoController).VideoModeDescription -split '\n')[0] -split ' ')[0]
Upvotes: 1
Reputation: 2293
Here's an answer based on Shays only it formats the results for each screen as per the OPs' example.
[System.Windows.Forms.Screen]::AllScreens
Add-Type -AssemblyName System.Windows.Forms
$screen_cnt = [System.Windows.Forms.Screen]::AllScreens.Count
$col_screens = [system.windows.forms.screen]::AllScreens
$info_screens = ($col_screens | ForEach-Object {
if ("$($_.Primary)" -eq "True") {$monitor_type = "Primary Monitor "} else {$monitor_type = "Secondary Monitor "}
if ("$($_.Bounds.Width)" -gt "$($_.Bounds.Height)") {$monitor_orientation = "Landscape"} else {$monitor_orientation = "Portrait"}
$monitor_type + "(Bounds) " + "$($_.Bounds)"
$monitor_type + "(Primary) " + "$($_.Primary)"
$monitor_type + "(Device Name) " + "$($_.DeviceName)"
$monitor_type + "(Bounds Width x Bounds Height) " + "$($_.Bounds.Width) x $($_.Bounds.Height) ($monitor_orientation)"
$monitor_type + "(Bits Per Pixel) " + "$($_.BitsPerPixel)"
$monitor_type + "(Working Area) " + "$($_.WorkingArea)"
}
)
Write-Host "TOTAL SCREEN COUNT: $screen_cnt"
$info_screens
# TOTAL SCREEN COUNT: 2
# Primary Monitor (Bounds) {X=0,Y=0,Width=2560,Height=1600}
# Primary Monitor (Primary) True
# Primary Monitor (Device Name) \\.\DISPLAY1
# Primary Monitor (Bounds Width x Bounds Height) 2560 x 1600 (Landscape)
# Primary Monitor (Bits Per Pixel) 32
# Primary Monitor (Working Area) {X=0,Y=0,Width=2560,Height=1560}
# Secondary Monitor (Bounds) {X=2560,Y=0,Width=1920,Height=1200}
# Secondary Monitor (Primary) False
# Secondary Monitor (Device Name) \\.\DISPLAY2
# Secondary Monitor (Bounds Width x Bounds Height) 1920 x 1200 (Landscape)
# Secondary Monitor (Bits Per Pixel) 32
# Secondary Monitor (Working Area) {X=2560,Y=0,Width=1920,Height=1160}
# TOTAL SCREEN COUNT: 2
# Primary Monitor (Bounds) {X=0,Y=0,Width=2560,Height=1600}
# Primary Monitor (Primary) True
# Primary Monitor (Device Name) \\.\DISPLAY1
# Primary Monitor (Bounds Width x Bounds Height) 2560 x 1600 (Landscape)
# Primary Monitor (Bits Per Pixel) 32
# Primary Monitor (Working Area) {X=0,Y=0,Width=2560,Height=1560}
# Secondary Monitor (Bounds) {X=2560,Y=0,Width=1200,Height=1920}
# Secondary Monitor (Primary) False
# Secondary Monitor (Device Name) \\.\DISPLAY2
# Secondary Monitor (Bounds Width x Bounds Height) 1200 x 1920 (Portrait)
# Secondary Monitor (Bits Per Pixel) 32
# Secondary Monitor (Working Area) {X=2560,Y=0,Width=1200,Height=1880}
Upvotes: 5
Reputation: 225
@Shay Levy's answer above accurately reports the Width/Height that was active when the powershell session was launched. If you rotate monitor after PS launch, it continues to report the original, now incorrect values.
The SystemInformation class provides another way to get orientation, and it changes in the current PS session even if the display is rotated after the session launch.
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.SystemInformation]::ScreenOrientation
Angle0
[System.Windows.Forms.SystemInformation]::PrimaryMonitorSize
IsEmpty Width Height
------- ----- ------
False 1680 1050
Rotate monitor, then...
[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
Upvotes: 4
Reputation: 3149
Same as the other answers, however for the plain cmd:
wmic path Win32_VideoController get VideoModeDescription
Upvotes: 9
Reputation:
You can grab this from the Win32_VideoController
WMI class. The VideoModeDescription
property includes the screen resolution and the color depth.
(Get-WmiObject -Class Win32_VideoController).VideoModeDescription;
1600 x 900 x 4294967296 colors
Upvotes: 23
Reputation: 126882
For the record, the PowerShell code is:
Get-WmiObject -Class Win32_DesktopMonitor | Select-Object ScreenWidth,ScreenHeight
I get the same values in Landscape or in Portrait mode.
UPDATE:
In a multi monitor environment you can get the info for all monitors with:
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}
Upvotes: 58
Reputation: 412
You can get all available resolution with this command:
$Query = "SELECT * FROM CIM_VideoControllerResolution"
$res = Get-WMIObject -query $Query | Select Caption
Upvotes: 1