public static extern int GetProcessDpiAwareness(IntPtr processHandle, out NativeMethods.PROCESS_DPI_AWARENESS awareness);
public static extern int SetProcessDpiAwareness(NativeMethods.PROCESS_DPI_AWARENESS awareness);
/// <summary> /// Sets the DPI awareness. If not available on the current OS, it falls back to the next possible. /// </summary> /// <returns>true/false - If the process DPI awareness is successfully set, returns true. Otherwise false.</returns> internal static bool SetWinformsApplicationDpiAwareness(HighDpiMode highDpiMode) { NativeMethods.PROCESS_DPI_AWARENESS dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNINITIALIZED; // For Windows 10 RS2 and above if (ApiHelper.IsApiAvailable(ExternDll.User32, nameof(SafeNativeMethods.SetProcessDpiAwarenessContext))) { int rs2AndAboveDpiFlag; switch (highDpiMode) { case HighDpiMode.SystemAware: rs2AndAboveDpiFlag = NativeMethods.DPI_AWARENESS_CONTEXT_SYSTEM_AWARE; break; case HighDpiMode.PerMonitor: rs2AndAboveDpiFlag = NativeMethods.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE; break; case HighDpiMode.PerMonitorV2: // Necessary for RS1, since this SetProcessDpiAwarenessContext IS available here. rs2AndAboveDpiFlag = SafeNativeMethods.IsValidDpiAwarenessContext(NativeMethods.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) ? NativeMethods.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 : NativeMethods.DPI_AWARENESS_CONTEXT_SYSTEM_AWARE; break; case HighDpiMode.DpiUnawareGdiScaled: // Let's make sure, we do not try to set a value which has been introduced in later Windows releases. rs2AndAboveDpiFlag = SafeNativeMethods.IsValidDpiAwarenessContext(NativeMethods.DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED) ? NativeMethods.DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED : NativeMethods.DPI_AWARENESS_CONTEXT_UNAWARE; break; default: rs2AndAboveDpiFlag = NativeMethods.DPI_AWARENESS_CONTEXT_UNAWARE; break; } return(SafeNativeMethods.SetProcessDpiAwarenessContext(rs2AndAboveDpiFlag)); } // For operating systems Windows 8.1 to Windows 10 RS1 version. else if (ApiHelper.IsApiAvailable(ExternDll.ShCore, nameof(SafeNativeMethods.SetProcessDpiAwareness))) { switch (highDpiMode) { case HighDpiMode.DpiUnaware: case HighDpiMode.DpiUnawareGdiScaled: dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNAWARE; break; case HighDpiMode.SystemAware: dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_SYSTEM_DPI_AWARE; break; case HighDpiMode.PerMonitor: case HighDpiMode.PerMonitorV2: dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_PER_MONITOR_DPI_AWARE; break; default: dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_SYSTEM_DPI_AWARE; break; } return(SafeNativeMethods.SetProcessDpiAwareness(dpiFlag) != NativeMethods.S_OK); } // For operating systems windows 7 to windows 8 else if (ApiHelper.IsApiAvailable(ExternDll.User32, nameof(SafeNativeMethods.SetProcessDPIAware))) { switch (highDpiMode) { case HighDpiMode.DpiUnaware: case HighDpiMode.DpiUnawareGdiScaled: // We can return, there is nothing to set if we assume we're already in DpiUnaware. return(true); case HighDpiMode.SystemAware: case HighDpiMode.PerMonitor: case HighDpiMode.PerMonitorV2: dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_SYSTEM_DPI_AWARE; break; } if (dpiFlag == NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_SYSTEM_DPI_AWARE) { return(SafeNativeMethods.SetProcessDPIAware()); } } return(false); }
public static bool SetWinformsApplicationDpiAwareness() { NativeMethods.PROCESS_DPI_AWARENESS pROCESS_DPI_AWARENESS = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNINITIALIZED; Version version = Environment.OSVersion.Version; if (!IsDpiAwarenessValueSet() || Environment.OSVersion.Platform != PlatformID.Win32NT) { return(false); } string text = (dpiAwarenessValue ?? string.Empty).ToLowerInvariant(); if (version.CompareTo(System.Windows.Forms.ConfigurationOptions.RS2Version) >= 0) { int processDpiAwarenessContext; switch (text) { case "true": case "system": processDpiAwarenessContext = -2; break; case "true/pm": case "permonitor": processDpiAwarenessContext = -3; break; case "permonitorv2": processDpiAwarenessContext = -4; break; default: processDpiAwarenessContext = -1; break; } if (!SafeNativeMethods.SetProcessDpiAwarenessContext(processDpiAwarenessContext)) { return(false); } } else if (version.CompareTo(new Version(6, 3, 0, 0)) >= 0 && version.CompareTo(System.Windows.Forms.ConfigurationOptions.RS2Version) < 0) { switch (text) { case "false": pROCESS_DPI_AWARENESS = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNAWARE; break; case "true": case "system": pROCESS_DPI_AWARENESS = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_SYSTEM_DPI_AWARE; break; case "true/pm": case "permonitor": case "permonitorv2": pROCESS_DPI_AWARENESS = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_PER_MONITOR_DPI_AWARE; break; default: pROCESS_DPI_AWARENESS = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNINITIALIZED; break; } if (SafeNativeMethods.SetProcessDpiAwareness(pROCESS_DPI_AWARENESS) != 0) { return(false); } } else { if (version.CompareTo(new Version(6, 1, 0, 0)) < 0 || version.CompareTo(new Version(6, 3, 0, 0)) >= 0) { return(false); } switch (text) { case "false": pROCESS_DPI_AWARENESS = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNAWARE; break; case "true": case "system": case "true/pm": case "permonitor": case "permonitorv2": pROCESS_DPI_AWARENESS = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_SYSTEM_DPI_AWARE; break; default: pROCESS_DPI_AWARENESS = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNINITIALIZED; break; } if (pROCESS_DPI_AWARENESS == NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_SYSTEM_DPI_AWARE && !SafeNativeMethods.SetProcessDPIAware()) { return(false); } } return(true); }
/// <summary> /// Sets DPI awareness for the process by reading configuration value from app.config file /// </summary> /// <returns>true/false - If process DPI awareness is successfully set, returns true. Otherwise false.</returns> public static bool SetWinformsApplicationDpiAwareness() { NativeMethods.PROCESS_DPI_AWARENESS dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNINITIALIZED; Version currentOSVersion = Environment.OSVersion.Version; if (!IsDpiAwarenessValueSet() || Environment.OSVersion.Platform != System.PlatformID.Win32NT) { return(false); } string dpiAwareness = (dpiAwarenessValue ?? string.Empty).ToLowerInvariant(); if (currentOSVersion.CompareTo(ConfigurationOptions.RS2Version) >= 0) { int rs2AndAboveDpiFlag; switch (dpiAwareness) { case "true": case "system": rs2AndAboveDpiFlag = NativeMethods.DPI_AWARENESS_CONTEXT_SYSTEM_AWARE; break; case "true/pm": case "permonitor": rs2AndAboveDpiFlag = NativeMethods.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE; break; case "permonitorv2": rs2AndAboveDpiFlag = NativeMethods.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2; break; case "false": default: rs2AndAboveDpiFlag = NativeMethods.DPI_AWARENESS_CONTEXT_UNAWARE; break; } if (!SafeNativeMethods.SetProcessDpiAwarenessContext(rs2AndAboveDpiFlag)) { return(false); } } // For operating systems windows 8.1 to Windows 10 redstone 1 version. else if (currentOSVersion.CompareTo(new Version(6, 3, 0, 0)) >= 0 && currentOSVersion.CompareTo(ConfigurationOptions.RS2Version) < 0) { switch (dpiAwareness) { case "false": dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNAWARE; break; case "true": case "system": dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_SYSTEM_DPI_AWARE; break; case "true/pm": case "permonitor": case "permonitorv2": dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_PER_MONITOR_DPI_AWARE; break; default: dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNINITIALIZED; break; } if (SafeNativeMethods.SetProcessDpiAwareness(dpiFlag) != NativeMethods.S_OK) { return(false); } } // For operating systems windows 7 to windows 8 else if (currentOSVersion.CompareTo(new Version(6, 1, 0, 0)) >= 0 && currentOSVersion.CompareTo(new Version(6, 3, 0, 0)) < 0) { switch (dpiAwareness) { case "false": dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNAWARE; break; case "true": case "system": case "true/pm": case "permonitor": case "permonitorv2": dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_SYSTEM_DPI_AWARE; break; default: dpiFlag = NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNINITIALIZED; break; } if (dpiFlag == NativeMethods.PROCESS_DPI_AWARENESS.PROCESS_SYSTEM_DPI_AWARE) { if (!SafeNativeMethods.SetProcessDPIAware()) { return(false); } } } // For windows vista and below, this is not a supported feature. else { return(false); } return(true); }