Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Resolution Bug #156

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 87 additions & 2 deletions winfetch.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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<DisplayInfo> m_displays = new List<DisplayInfo>();

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<DisplayInfo>();
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 @{
Expand Down