From 5b41e2d311701333cb358554c098d3c2136d6e0e Mon Sep 17 00:00:00 2001 From: Timothy Baldridge Date: Thu, 20 Feb 2020 16:08:12 -0700 Subject: [PATCH] Calculate screen size using DPI aware routeins (#545) --- CHANGELOG.md | 1 + Wabbajack/Util/SystemParametersConstructor.cs | 43 +++++++++++++++++-- Wabbajack/Wabbajack.csproj | 3 ++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71ec8363..3bb4b4bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * Don't print API keys in logs (#533) * Store xxHash caches in binary format (#530) * Added support for Morrowind BSA creation/unpacking +* Calculate screen size using DPI aware routines (#545) #### Version - 0.9.19.0 diff --git a/Wabbajack/Util/SystemParametersConstructor.cs b/Wabbajack/Util/SystemParametersConstructor.cs index e8b3ddbc..6c5d7be8 100644 --- a/Wabbajack/Util/SystemParametersConstructor.cs +++ b/Wabbajack/Util/SystemParametersConstructor.cs @@ -1,16 +1,53 @@ -using MahApps.Metro.Controls; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using MahApps.Metro.Controls; +using Microsoft.VisualBasic; +using PInvoke; using Wabbajack.Lib; +using static PInvoke.User32; +using static PInvoke.Gdi32; namespace Wabbajack.Util { + // Much of the GDI code here is taken from : https://github.com/ModOrganizer2/modorganizer/blob/master/src/envmetrics.cpp + // Thanks to MO2 for being good citizens and supporting OSS code public static class SystemParametersConstructor { + private static List<(int Width, int Height, bool IsPrimary)> GetDisplays() + { + // Needed to make sure we get the right values from this call + SetProcessDPIAware(); + unsafe + { + + var col = new List<(int Width, int Height, bool IsPrimary)>(); + + EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, + delegate(IntPtr hMonitor, IntPtr hdcMonitor, RECT* lprcMonitor, void *dwData) + { + MONITORINFOEX mi = new MONITORINFOEX(); + mi.cbSize = Marshal.SizeOf(mi); + bool success = GetMonitorInfo(hMonitor, (MONITORINFO*)&mi); + if (success) + { + col.Add(((mi.Monitor.right - mi.Monitor.left), (mi.Monitor.bottom - mi.Monitor.top), mi.Flags == 1)); + } + + return true; + }, IntPtr.Zero); + return col; + } + } + public static SystemParameters Create() { + var (width, height, _) = GetDisplays().First(d => d.IsPrimary); return new SystemParameters { - ScreenWidth = (int)System.Windows.SystemParameters.PrimaryScreenWidth, - ScreenHeight = (int)System.Windows.SystemParameters.PrimaryScreenHeight + ScreenWidth = width, + ScreenHeight = height }; } } diff --git a/Wabbajack/Wabbajack.csproj b/Wabbajack/Wabbajack.csproj index cfd358cc..edd174b3 100644 --- a/Wabbajack/Wabbajack.csproj +++ b/Wabbajack/Wabbajack.csproj @@ -12,6 +12,7 @@ An automated ModList installer true + true @@ -65,6 +66,8 @@ + +