Feedback

C# - Bildschirmskalierung bestimmen

Veröffentlicht von am 06.04.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!