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,
}
}
Kommentare zum Snippet