public static extern int GetProcessDpiAwareness(IntPtr processHandle, out NativeMethods.PROCESS_DPI_AWARENESS awareness);
 public static extern int SetProcessDpiAwareness(NativeMethods.PROCESS_DPI_AWARENESS awareness);
示例#3
0
        /// <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);
        }
示例#4
0
        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);
        }
示例#5
0
        /// <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);
        }