diff options
Diffstat (limited to 'Ryujinx.Common/System/ForceDpiAware.cs')
| -rw-r--r-- | Ryujinx.Common/System/ForceDpiAware.cs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/Ryujinx.Common/System/ForceDpiAware.cs b/Ryujinx.Common/System/ForceDpiAware.cs new file mode 100644 index 00000000..81c69376 --- /dev/null +++ b/Ryujinx.Common/System/ForceDpiAware.cs @@ -0,0 +1,45 @@ +using Ryujinx.Common.Logging; +using System; +using System.Drawing; +using System.Runtime.InteropServices; + +namespace Ryujinx.Common.System +{ + public static class ForceDpiAware + { + [DllImport("user32.dll")] + private static extern bool SetProcessDPIAware(); + + private static readonly double _standardDpiScale = 96.0; + private static readonly double _maxScaleFactor = 1.25; + + /// <summary> + /// Marks the application as DPI-Aware when running on the Windows operating system. + /// </summary> + public static void Windows() + { + // Make process DPI aware for proper window sizing on high-res screens. + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && Environment.OSVersion.Version.Major >= 6) + { + SetProcessDPIAware(); + } + } + + public static double GetWindowScaleFactor() + { + double userDpiScale; + + try + { + userDpiScale = Graphics.FromHwnd(IntPtr.Zero).DpiX; + } + catch (Exception e) + { + Logger.Warning?.Print(LogClass.Application, $"Couldn't determine monitor DPI: {e.Message}"); + userDpiScale = 96.0; + } + + return Math.Min(userDpiScale / _standardDpiScale, _maxScaleFactor); + } + } +} |
