Esempio n. 1
0
        /// <summary>
        /// Checks if requested API is available in the give library that exist on the machine
        /// </summary>
        /// <param name="libName"> library name</param>
        /// <param name="procName">function name</param>
        /// <returns>return 'true' if given procName available in the installed libName(dll) </returns>
        public static bool IsApiAvailable(string libName, string procName)
        {
            bool isAvailable = false;

            if (!string.IsNullOrEmpty(libName) && !string.IsNullOrEmpty(procName))
            {
                var key = new Tuple <string, string>(libName, procName);

                if (availableApis.TryGetValue(key, out isAvailable))
                {
                    return(isAvailable);
                }

                //load library from system path.
                IntPtr hmod = CommonUnsafeNativeMethods.LoadLibraryFromSystemPathIfAvailable(libName);
                if (hmod != IntPtr.Zero)
                {
                    IntPtr pfnProc = CommonUnsafeNativeMethods.GetProcAddress(new HandleRef(isAvailable, hmod), procName);
                    if (pfnProc != IntPtr.Zero)
                    {
                        isAvailable = true;
                    }
                }

                CommonUnsafeNativeMethods.FreeLibrary(new HandleRef(isAvailable, hmod));
                availableApis[key] = isAvailable;
            }

            return(isAvailable);
        }
Esempio n. 2
0
 private void ResetDpiAwarenessContextChanges()
 {
     if (dpiAwarenessScopeIsSet)
     {
         CommonUnsafeNativeMethods.TrySetThreadDpiAwarenessContext(originalAwareness);
         dpiAwarenessScopeIsSet = false;
     }
 }
Esempio n. 3
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 (OsVersion.IsWindows10_1607OrGreater)
            {
                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);
                }
            }
            else if (OsVersion.IsWindows8_1OrGreater)
            {
                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);
                }
            }
            else
            {
                // Available on Vista and higher
                return(SafeNativeMethods.IsProcessDPIAware() ?
                       HighDpiMode.SystemAware :
                       HighDpiMode.DpiUnaware);
            }

            // We should never get here, except someone ported this with force to < Windows 7.
            return(HighDpiMode.DpiUnaware);
        }
Esempio n. 4
0
 public DpiAwarenessScope(System.Windows.Forms.DpiAwarenessContext awareness)
 {
     if (!EnableDpiChangedHighDpiImprovements)
     {
         return;
     }
     try
     {
         if (!CommonUnsafeNativeMethods.TryFindDpiAwarenessContextsEqual(awareness, System.Windows.Forms.DpiAwarenessContext.DPI_AWARENESS_CONTEXT_UNSPECIFIED))
         {
             originalAwareness = CommonUnsafeNativeMethods.GetThreadDpiAwarenessContext();
             if (!CommonUnsafeNativeMethods.TryFindDpiAwarenessContextsEqual(originalAwareness, awareness) && !CommonUnsafeNativeMethods.TryFindDpiAwarenessContextsEqual(originalAwareness, System.Windows.Forms.DpiAwarenessContext.DPI_AWARENESS_CONTEXT_UNAWARE))
             {
                 originalAwareness      = CommonUnsafeNativeMethods.SetThreadDpiAwarenessContext(awareness);
                 dpiAwarenessScopeIsSet = true;
             }
         }
     }
     catch (EntryPointNotFoundException)
     {
         dpiAwarenessScopeIsSet = false;
     }
 }
Esempio n. 5
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);
        }