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.
GFU-Schulungen  [Anzeige]

ASP.NET Core - Der Einstieg

In nur 3 Tagen lernen Sie, wie man mit ASP.NET Core und den Technologien MVC, Entity Framework, WebAPI und Razor professionelle Web-Anwendungs-Architekturen aufbaut. Diese Schulung ist der perfekte Einstieg, um datengetriebene und präsentations-orientierte Applikationen auf Basis der ASP.NET Core Plattform zu erstellen.

Angular mit ASP.NET Core für .NET-Entwickler

.NET ist Ihnen vertraut, als Entwickler verfügen Sie über einschlägige Kenntnisse. In diesem Kurs lernen Sie nun, Angular in .NET-Umgebungen einzusetzen. Sie verstehen das Konzept von Angular und integrieren das clientseitige JS-Framework sicher in.NET-Anwendungen.

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!