Ejemplo n.º 1
0
        static Dpi GetDpiFromGetDpiForMonitor(IntPtr hMonitor, Win32.MonitorDpiType dpiType)
        {
            try
            {
                var  ret = new Dpi();
                uint dpiX = 0, dpiY = 0;
                Win32.NativeMethods.GetDpiForMonitor(hMonitor, dpiType, ref dpiX, ref dpiY);
                ret.X = dpiX;
                ret.Y = dpiY;
                return(ret);
            }
            catch (Exception ex)
            {
#if DEBUG
                Debugger.Break();
#endif
                Debug.WriteLine(ex.Message);
                return(Dpi.Default);
            }
        }
        /// <summary>
        /// You can get current screen's DPi (screen which has mouse cursor currently), when you set dpiType to RawDpi or AngularDpi.
        /// Refer to https://msdn.microsoft.com/en-us/library/windows/desktop/dn280510(v=vs.85).aspx
        /// </summary>
        public static Dpi GetDpiFromGetDpiForMonitor(System.Windows.Media.Visual visual, Win32.MonitorDpiType dpiType = Win32.MonitorDpiType.Default)
        {
            Debug.Assert(visual != null);
            if (visual == null)
            {
                return(Dpi.Default);
            }
            // NOTE: app.manifestに、Windows8.1対応を明記しなければならないため、このような判定は行わないことにする。
            //if (IsPerMonitorDpiServiceSupported == false) { return GetDpiFromCompositionTargetTransformToDevice(visual); }
            var hwndSource = PresentationSource.FromVisual(visual) as System.Windows.Interop.HwndSource;

            if (hwndSource == null)
            {
                return(Dpi.Default);
            }
            var  hmonitor = Win32.NativeMethods.MonitorFromWindow(hwndSource.Handle, Win32.NativeMethods.MonitorDefaultTo.MONITOR_DEFAULTTONEAREST);
            uint dpiX = 96, dpiY = 96;

            Win32.NativeMethods.GetDpiForMonitor(hmonitor, (Win32.MonitorDpiType)dpiType, ref dpiX, ref dpiY);
            return(new Dpi((int)dpiX, (int)dpiY));
        }