Feedback

C# - Bildschirmskalierung bestimmen

Veröffentlicht von am 4/6/2015
(0 Bewertungen)
Diese Erweiterungsmethode liefert die Skalierung eines Bildschirms zurück.

Benötigt wird ein Verweis auf System.Windows.Forms und auf System.Drawing. Die Erweiterungsmethode liegt im selben Namespace wie die Screen-Klasse.
namespace System.Windows.Forms
{
    using System;
    using System.Drawing;
    using System.Runtime.InteropServices;

    /// <summary>
    /// Enthält Erweiterungen für die <see cref="System.Windows.Forms.Screen"/>-Klasse.
    /// </summary>
    public static class ScreenExtensions
    {
        /// <summary>
        /// Gibt die Skalierung für den Bildschirm zurück.
        /// </summary>
        /// <param name="screen">Der Bildschirm, dessen Skalierung abgerufen werden soll.</param>
        /// <param name="dpiType">Die Art der abzurufenden Skalierung.</param>
        /// <param name="dpiX">Gibt die horizontale skalierung zurück.</param>
        /// <param name="dpiY">Gibt die vertikale skalierung zurück.</param>
        public static void GetDpi(this Screen screen, DpiType dpiType, out uint dpiX, out uint dpiY)
        {
            var point = new Point(screen.Bounds.Left + 1, screen.Bounds.Top + 1);
            var hmonitor = MonitorFromPoint(point, MONITOR_DEFAULTTONEAREST);

            switch (GetDpiForMonitor(hmonitor, dpiType, out dpiX, out dpiY).ToInt32())
            {
                case S_OK: return;
                case E_INVALIDARG:
                    throw new ArgumentException("Unknown error. See https://msdn.microsoft.com/en-us/library/windows/desktop/dn280510.aspx for more information.");
                default:
                    throw new COMException("Unknown error. See https://msdn.microsoft.com/en-us/library/windows/desktop/dn280510.aspx for more information.");
            }
        }

        //https://msdn.microsoft.com/en-us/library/windows/desktop/dd145062.aspx
        [DllImport("User32.dll")]
        private static extern IntPtr MonitorFromPoint([In]Point pt, [In]uint dwFlags);

        //https://msdn.microsoft.com/en-us/library/windows/desktop/dn280510.aspx
        [DllImport("Shcore.dll")]
        private static extern IntPtr GetDpiForMonitor([In]IntPtr hmonitor, [In]DpiType dpiType, [Out]out uint dpiX, [Out]out uint dpiY);

        const int S_OK = 0;
        const int MONITOR_DEFAULTTONEAREST = 2;
        const int E_INVALIDARG = -2147024809;
    }

    /// <summary>
    /// Stellt die verschiedenen Arten von Skalierung dar.
    /// </summary>
    /// <seealso cref="https://msdn.microsoft.com/en-us/library/windows/desktop/dn280511.aspx"/>
    public enum DpiType
    {
        Effective = 0,
        Angular = 1,
        Raw = 2,
    }
}

Abgelegt unter DPI, Windows, Screen, WinAPI, Erweiterungsmethode.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!