TheRob87
TheRob87

Reputation: 146

Powershell Screen Resolution in Win11

I would like to get the screen resolution of all my monitors; I require this info for an application.

I've tried:

Add-Type -AssemblyName System.Windows.Forms
$result = [System.Windows.Forms.Screen]::AllScreens
$result 

With the following results:

WorkingArea={X=-3840,Y=512,Width=2560,Height=1528} while I expect 2560 x 1600. WorkingArea={X=0,Y=0,Width=2880,Height=1728} while I expect 1920 x 1200.

How can I get the expected resolutions through PowerShell?

Update:

The proposed solutions don't work as expected, unfortunately:

Add-Type -AssemblyName System.Windows.Forms

[System.Windows.Forms.Screen]::AllScreens | 
  ForEach-Object { '{0} x {1}' -f $_.Bounds.Width, $_.Bounds.Height } 

Output:

2560 x 1600 
2880 x 1620

And

$height = (((Get-WmiObject -Class Win32_VideoController).VideoModeDescription  -split '\n')[0]  -split ' ')[2]
$width = (((Get-WmiObject -Class Win32_VideoController).VideoModeDescription  -split '\n')[0]  -split ' ')[0]
echo $width, $height

Output:

1920 1200

The real resolutions are ("empfohlen" means recommended):

Their arrangement is:

Placing

Upvotes: 0

Views: 471

Answers (2)

mklement0
mklement0

Reputation: 439777

Note: I'm offering this as a general solution; you state that the first solution below doesn't report the correct resolution for one of your displays, but it is unclear why.

It looks like your intent is to get the display resolution[1] of all currently connected displays in the form of a '<horizontal-pixels> x <vertical-pixels>' string, e.g. '2560 x 1600'

[System.Windows.Forms.Screen]::AllScreens is indeed the right class to use, but you want the .Bounds property of each [Screen] instance returned, not the .WorkingArea property (the latter describes the rectangle comprising "the desktop area of the display, excluding taskbars, docked windows, and docked tool bars."):

Add-Type -AssemblyName System.Windows.Forms

[System.Windows.Forms.Screen]::AllScreens | 
  ForEach-Object { '{0} x {1}' -f $_.Bounds.Width, $_.Bounds.Height } 

An alternative is to use the third-party DisplayConfig module (which is Windows-only, just like the WinForms solution above),[2] which you can install with, e.g.,
Install-Module -Scope CurrentUser DisplayConfig:

# ->, e.g., '2560 x 1600', '2880 x 1800'
Get-DisplayInfo | ForEach-Object { '{0} x {1}' -f $_.Mode.Width, $_.Mode.Height }

[1] Note that the solutions in this answer report the software-based resolution (the current video mode), which typically, but not always, is the same as the display-native resolution.

[2] Specifically, the module is built on top of the Windows CCD (Connecting and Configuring Displays) APIs.

Upvotes: 0

jdweng
jdweng

Reputation: 34421

The following calls user32.dll

enum SystemMetric
  {
    SM_CXSCREEN            = 0  # 0x00
    SM_CYSCREEN            = 1  # 0x01
    SM_CXVSCROLL           = 2  # 0x02
    SM_CYHSCROLL           = 3  # 0x03
    SM_CYCAPTION           = 4  # 0x04
    SM_CXBORDER            = 5  # 0x05
    SM_CYBORDER            = 6  # 0x06
    SM_CXDLGFRAME          = 7  # 0x07
    SM_CXFIXEDFRAME        = 7  # 0x07
    SM_CYDLGFRAME          = 8  # 0x08
    SM_CYFIXEDFRAME        = 8  # 0x08
    SM_CYVTHUMB            = 9  # 0x09
    SM_CXHTHUMB            = 10 # 0x0A
    SM_CXICON              = 11 # 0x0B
    SM_CYICON              = 12 # 0x0C
    SM_CXCURSOR            = 13 # 0x0D
    SM_CYCURSOR            = 14 # 0x0E
    SM_CYMENU              = 15 # 0x0F
    SM_CXFULLSCREEN        = 16 # 0x10
    SM_CYFULLSCREEN        = 17 # 0x11
    SM_CYKANJIWINDOW           = 18 # 0x12
    SM_MOUSEPRESENT        = 19 # 0x13
    SM_CYVSCROLL           = 20 # 0x14
    SM_CXHSCROLL           = 21 # 0x15
    SM_DEBUG               = 22 # 0x16
    SM_SWAPBUTTON          = 23 # 0x17
    SM_CXMIN               = 28 # 0x1C
    SM_CYMIN               = 29 # 0x1D
    SM_CXSIZE              = 30 # 0x1E
    SM_CYSIZE              = 31 # 0x1F
    SM_CXSIZEFRAME         = 32 # 0x20
    SM_CXFRAME             = 32 # 0x20
    SM_CYSIZEFRAME         = 33 # 0x21
    SM_CYFRAME             = 33 # 0x21
    SM_CXMINTRACK          = 34 # 0x22
    SM_CYMINTRACK          = 35 # 0x23
    SM_CXDOUBLECLK         = 36 # 0x24
    SM_CYDOUBLECLK         = 37 # 0x25
    SM_CXICONSPACING           = 38 # 0x26
    SM_CYICONSPACING           = 39 # 0x27
    SM_MENUDROPALIGNMENT       = 40 # 0x28
    SM_PENWINDOWS          = 41 # 0x29
    SM_DBCSENABLED         = 42 # 0x2A
    SM_CMOUSEBUTTONS           = 43 # 0x2B
    SM_SECURE              = 44 # 0x2C
    SM_CXEDGE              = 45 # 0x2D
    SM_CYEDGE              = 46 # 0x2E
    SM_CXMINSPACING        = 47 # 0x2F
    SM_CYMINSPACING        = 48 # 0x30
    SM_CXSMICON            = 49 # 0x31
    SM_CYSMICON            = 50 # 0x32
    SM_CYSMCAPTION         = 51 # 0x33
    SM_CXSMSIZE            = 52 # 0x34
    SM_CYSMSIZE            = 53 # 0x35
    SM_CXMENUSIZE          = 54 # 0x36
    SM_CYMENUSIZE          = 55 # 0x37
    SM_ARRANGE             = 56 # 0x38
    SM_CXMINIMIZED         = 57 # 0x39
    SM_CYMINIMIZED         = 58 # 0x3A
    SM_CXMAXTRACK          = 59 # 0x3B
    SM_CYMAXTRACK          = 60 # 0x3C
    SM_CXMAXIMIZED         = 61 # 0x3D
    SM_CYMAXIMIZED         = 62 # 0x3E
    SM_NETWORK             = 63 # 0x3F
    SM_CLEANBOOT           = 67 # 0x43
    SM_CXDRAG              = 68 # 0x44
    SM_CYDRAG              = 69 # 0x45
    SM_SHOWSOUNDS          = 70 # 0x46
    SM_CXMENUCHECK         = 71 # 0x47
    SM_CYMENUCHECK         = 72 # 0x48
    SM_SLOWMACHINE         = 73 # 0x49
    SM_MIDEASTENABLED          = 74 # 0x4A
    SM_MOUSEWHEELPRESENT       = 75 # 0x4B
    SM_XVIRTUALSCREEN          = 76 # 0x4C
    SM_YVIRTUALSCREEN          = 77 # 0x4D
    SM_CXVIRTUALSCREEN         = 78 # 0x4E
    SM_CYVIRTUALSCREEN         = 79 # 0x4F
    SM_CMONITORS           = 80 # 0x50
    SM_SAMEDISPLAYFORMAT       = 81 # 0x51
    SM_IMMENABLED          = 82 # 0x52
    SM_CXFOCUSBORDER           = 83 # 0x53
    SM_CYFOCUSBORDER           = 84 # 0x54
    SM_TABLETPC            = 86 # 0x56
    SM_MEDIACENTER         = 87 # 0x57
    SM_STARTER             = 88 # 0x58
    SM_SERVERR2            = 89 # 0x59
    SM_MOUSEHORIZONTALWHEELPRESENT = 91 # 0x5B
    SM_CXPADDEDBORDER          = 92 # 0x5C
    SM_DIGITIZER           = 94 # 0x5E
    SM_MAXIMUMTOUCHES          = 95 # 0x5F
    SM_REMOTESESSION           = 0x1000 # 0x1000
    SM_SHUTTINGDOWN        = 0x2000 # 0x2000
    SM_REMOTECONTROL           = 0x2001 # 0x2001
    SM_CONVERTIBLESLATEMODE    = 0x2003
    SM_SYSTEMDOCKED        = 0x2004
  }


$Signature = @"
[DllImport("user32.dll")]public static extern int GetSystemMetrics(int smIndex);
"@

$addTypeSplat = @{
    MemberDefinition = $Signature
    Name = "GetSystemMetrics32"
    Namespace = 'Win32Functions'
    PassThru = $true
}
$GetSystemMetrics = Add-Type @addTypeSplat


$GetSystemMetrics::GetSystemMetrics([int][SystemMetric]::SM_CXFULLSCREEN)

Upvotes: -2

Related Questions