diff --git a/winfetch.ps1 b/winfetch.ps1 index aadf9ac..b57679d 100644 --- a/winfetch.ps1 +++ b/winfetch.ps1 @@ -617,8 +617,93 @@ function info_uptime { # ===== RESOLUTION ===== function info_resolution { Add-Type -AssemblyName System.Windows.Forms - $displays = foreach ($monitor in [System.Windows.Forms.Screen]::AllScreens) { - "$($monitor.Bounds.Size.Width)x$($monitor.Bounds.Size.Height)" + + # Checks if running as admin + if((New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)){ + [System.Collections.ArrayList]$displays = @() + # Gets the current screen layout from the registry + Get-ChildItem -path HKLM:\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\ | Get-ItemProperty | ForEach-Object{ + if($_.Timestamp -gt $timestamp){ + $layout = $_ + $timestamp = $_.timestamp + } + } + + # Gets resolution and refresh rate for each display + $displays = $layout | Get-ChildItem | Get-ChildItem | Get-ItemProperty | ForEach-Object{ + "$($_."ActiveSize.cx")x$($_."ActiveSize.cy")@$($_."VSyncFreq.Numerator"/$_."VSyncFreq.Denominator")Hz" + } + }else{ + # Use Add-Type Method (at least 4x slower) + Add-Type @" + using System.Runtime.InteropServices; + using System.Collections.Generic; + using System; + using System.Linq; + namespace WinAPI + { + public class MonitorMethods + { + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + struct MONITORINFOEX + { + public int Size; + public Rect Monitor; + public Rect WorkArea; + public uint Flags; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] + public string DeviceName; + } + + [DllImport("Shcore.dll")] + static public extern bool SetProcessDpiAwareness(int value); + [DllImport("user32.dll")] + static extern bool EnumDisplayMonitors( + IntPtr hdc, + IntPtr lprcClip, + EnumMonitorsDelegate lpfnEnum, + IntPtr dwData + ); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFOEX lpmi); + [StructLayout(LayoutKind.Sequential)] + public struct Rect + { + public int left; + public int top; + public int right; + public int bottom; + } + delegate bool EnumMonitorsDelegate(IntPtr hMonitor, IntPtr hdcMonitor, ref Rect lprcMonitor, IntPtr dwData); + static private List m_displays = new List(); + + static bool EnumProc(IntPtr hMonitor, IntPtr hdcMonitor, ref Rect lprcMonitor, IntPtr dwData) + { + MONITORINFOEX mONITORINFOEX = new MONITORINFOEX(); + mONITORINFOEX.Size = Marshal.SizeOf(typeof(MONITORINFOEX)); + GetMonitorInfo(hMonitor, ref mONITORINFOEX); + var displayInfo = new DisplayInfo(); + displayInfo.X = (int)((mONITORINFOEX.Monitor.right - mONITORINFOEX.Monitor.left)); + displayInfo.Y = (int)((mONITORINFOEX.Monitor.bottom - mONITORINFOEX.Monitor.top)); + m_displays.Add(displayInfo); + return true; + } + public class DisplayInfo + { + public int X; + public int Y; + } + public static string GetResolution() + { + SetProcessDpiAwareness(2); + m_displays = new List(); + EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, EnumProc, IntPtr.Zero); + return String.Join(", ", m_displays.Select(displayInfo => displayInfo.X.ToString() + "x" + displayInfo.Y.ToString())); + } + } + } +"@ + $displays = [WinAPI.MonitorMethods]::GetResolution() } return @{