diff --git a/winfetch.ps1 b/winfetch.ps1 index 0ec2663..98427e3 100644 --- a/winfetch.ps1 +++ b/winfetch.ps1 @@ -572,14 +572,86 @@ 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)" - } + 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())); + } + } +} +"@ return @{ title = "Resolution" - content = $displays -join ', ' + content = [WinAPI.MonitorMethods]::GetResolution() } }