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 @@
+
+