/// <summary>
        /// Tries to compare two DPIawareness context values. Return true if they were equal.
        /// Return false when they are not equal or underlying OS does not support this API.
        /// </summary>
        /// <returns>true/false</returns>
        public static bool TryFindDpiAwarenessContextsEqual(DpiAwarenessContext dpiContextA, DpiAwarenessContext dpiContextB)
        {
            if (ApiHelper.IsApiAvailable(ExternDll.User32, "AreDpiAwarenessContextsEqual"))
            {
                return(AreDpiAwarenessContextsEqual(dpiContextA, dpiContextB));
            }

            return(false);
        }
Exemple #2
0
        /// <summary>
        /// Gets the DPI awareness.
        /// </summary>
        /// <returns>The thread's/process' current HighDpi mode</returns>
        internal static HighDpiMode GetWinformsApplicationDpiAwareness()
        {
            // For Windows 10 RS2 and above
            if (ApiHelper.IsApiAvailable(ExternDll.User32, nameof(CommonUnsafeNativeMethods.GetThreadDpiAwarenessContext)))
            {
                DpiAwarenessContext dpiAwareness = CommonUnsafeNativeMethods.GetThreadDpiAwarenessContext();

                if (CommonUnsafeNativeMethods.TryFindDpiAwarenessContextsEqual(dpiAwareness, DpiAwarenessContext.DPI_AWARENESS_CONTEXT_SYSTEM_AWARE))
                {
                    return(HighDpiMode.SystemAware);
                }

                if (CommonUnsafeNativeMethods.TryFindDpiAwarenessContextsEqual(dpiAwareness, DpiAwarenessContext.DPI_AWARENESS_CONTEXT_UNAWARE))
                {
                    return(HighDpiMode.DpiUnaware);
                }

                if (CommonUnsafeNativeMethods.TryFindDpiAwarenessContextsEqual(dpiAwareness, DpiAwarenessContext.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2))
                {
                    return(HighDpiMode.PerMonitorV2);
                }

                if (CommonUnsafeNativeMethods.TryFindDpiAwarenessContextsEqual(dpiAwareness, DpiAwarenessContext.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE))
                {
                    return(HighDpiMode.PerMonitor);
                }

                if (CommonUnsafeNativeMethods.TryFindDpiAwarenessContextsEqual(dpiAwareness, DpiAwarenessContext.DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED))
                {
                    return(HighDpiMode.DpiUnawareGdiScaled);
                }
            }

            // For operating systems windows 8.1 to Windows 10 redstone 1 version.
            else if (ApiHelper.IsApiAvailable(ExternDll.ShCore, nameof(SafeNativeMethods.GetProcessDpiAwareness)))
            {
                SafeNativeMethods.GetProcessDpiAwareness(IntPtr.Zero, out CAPS.PROCESS_DPI_AWARENESS processDpiAwareness);
                switch (processDpiAwareness)
                {
                case CAPS.PROCESS_DPI_AWARENESS.PROCESS_DPI_UNAWARE:
                    return(HighDpiMode.DpiUnaware);

                case CAPS.PROCESS_DPI_AWARENESS.PROCESS_SYSTEM_DPI_AWARE:
                    return(HighDpiMode.SystemAware);

                case CAPS.PROCESS_DPI_AWARENESS.PROCESS_PER_MONITOR_DPI_AWARE:
                    return(HighDpiMode.PerMonitor);
                }
            }

            // For operating systems windows 7 to windows 8
            else if (ApiHelper.IsApiAvailable(ExternDll.User32, nameof(SafeNativeMethods.IsProcessDPIAware)))
            {
                return(SafeNativeMethods.IsProcessDPIAware() ?
                       HighDpiMode.SystemAware :
                       HighDpiMode.DpiUnaware);
            }

            // We should never get here, except someone ported this with force to < Windows 7.
            return(HighDpiMode.DpiUnaware);
        }
Exemple #3
0
 /// <summary>
 ///  Enters a scope during which the current thread's DPI awareness context is set to
 /// <paramref name="awareness"/>
 /// </summary>
 /// <param name="awareness">The new DPI awareness for the current thread</param>
 /// <returns>An object that, when disposed, will reset the current thread's
 ///  DPI awareness to the value it had when the object was created.</returns>
 public static IDisposable EnterDpiAwarenessScope(DpiAwarenessContext awareness)
 {
     return(new DpiAwarenessScope(awareness));
 }
        /// <summary>
        ///  Tries to compare two DPIawareness context values. Return true if they were equal.
        ///  Return false when they are not equal or underlying OS does not support this API.
        /// </summary>
        /// <returns>true/false</returns>
        public static bool TryFindDpiAwarenessContextsEqual(DpiAwarenessContext dpiContextA, DpiAwarenessContext dpiContextB)
        {
            if (OsVersion.IsWindows10_1607OrGreater)
            {
                return(AreDpiAwarenessContextsEqual(dpiContextA, dpiContextB));
            }

            return(false);
        }
Exemple #5
0
 public static extern bool IsValidDpiAwarenessContext(DpiAwarenessContext dpiAwarenessContext);
Exemple #6
0
        /// <summary>
        /// Tries to compare two DPIawareness context values. Return true if they were equal.
        /// Return false when they are not equal or underlying OS does not support this API.
        /// </summary>
        /// <returns>true/false</returns>
        public static bool TryFindDpiAwarenessContextsEqual(DpiAwarenessContext dpiContextA, DpiAwarenessContext dpiContextB)
        {
            // User.32 AreDpiAwarenessContextsEqual API returns false when sent custom values like DPI_AWARENESS_CONTEXT_UNSPECIFIED, but it is true when both are equal to the same custom value.
            if (dpiContextA == DpiAwarenessContext.DPI_AWARENESS_CONTEXT_UNSPECIFIED && dpiContextB == DpiAwarenessContext.DPI_AWARENESS_CONTEXT_UNSPECIFIED)
            {
                return(true);
            }

            if (ApiHelper.IsApiAvailable(ExternDll.User32, "AreDpiAwarenessContextsEqual"))
            {
                return(AreDpiAwarenessContextsEqual(dpiContextA, dpiContextB));
            }

            return(false);
        }
Exemple #7
0
 public static extern DpiAwareness GetAwarenessFromDpiAwarenessContext(DpiAwarenessContext dpiAwarenessContext);
        /// <summary>
        ///  Tries to compare two DPIawareness context values. Return true if they were equal.
        ///  Return false when they are not equal or underlying OS does not support this API.
        /// </summary>
        /// <returns>true/false</returns>
        public static bool TryFindDpiAwarenessContextsEqual(DpiAwarenessContext dpiContextA, DpiAwarenessContext dpiContextB)
        {
            if (dpiContextA == DpiAwarenessContext.DPI_AWARENESS_CONTEXT_UNSPECIFIED && dpiContextB == DpiAwarenessContext.DPI_AWARENESS_CONTEXT_UNSPECIFIED)
            {
                return(true);
            }

            if (OsVersion.IsWindows10_1607OrGreater)
            {
                return(AreDpiAwarenessContextsEqual(dpiContextA, dpiContextB));
            }

            return(false);
        }
Exemple #9
0
 public static extern bool SetProcessDpiAwarenessContext(DpiAwarenessContext dpiAwarenessContext);
Exemple #10
0
 public static extern DpiAwarenessContext SetThreadDpiAwarenessContext(DpiAwarenessContext dpiAwarenessContext);
        /// <summary>
        /// Tries to compare two DPIawareness context values. Return true if they were equal.
        /// Return false when they are not equal or underlying OS does not support this API.
        /// </summary>
        /// <returns>true/false</returns>
        public static bool TryFindDpiAwarenessContextsEqual(DpiAwarenessContext dpiContextA, DpiAwarenessContext dpiContextB)
        {
            if (dpiContextA == DpiAwarenessContext.DPI_AWARENESS_CONTEXT_UNSPECIFIED && dpiContextB == DpiAwarenessContext.DPI_AWARENESS_CONTEXT_UNSPECIFIED)
            {
                return(true);
            }
            if (ApiHelper.IsApiAvailable(ExternDll.User32, nameof(CommonUnsafeNativeMethods.AreDpiAwarenessContextsEqual)))
            {
                return(AreDpiAwarenessContextsEqual(dpiContextA, dpiContextB));
            }

            return(false);
        }
Exemple #12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DpiAwarenessContextHandle"/> class.
 /// </summary>
 /// <param name="dpiAwarenessContext"><see cref="DpiAwarenessContext"/> value.</param>
 public DpiAwarenessContextHandle(DpiAwarenessContext dpiAwarenessContext)
     : this(new IntPtr((int)dpiAwarenessContext))
 {
 }
Exemple #13
0
 /// <inheritdoc/>
 public bool Equals([AllowNull] DpiAwarenessContext other) => this.Equals(WellKnownDpiAwarenessContextValues[other]);
 internal static extern DpiAwarenessContext SetThreadDpiAwarenessContext(DpiAwarenessContext dpiContext);
Exemple #15
0
 public static extern uint GetDpiFromDpiAwarenessContext(DpiAwarenessContext dpiAwarenessContext);
 internal static extern bool AreDpiAwarenessContextsEqual(DpiAwarenessContext dpiContextA, DpiAwarenessContext dpiContextB);
Exemple #17
0
 internal static extern bool SetProcessDpiAwarenessContext(DpiAwarenessContext dpiFlag);