Il existe un paramètre pour l'affichage dans Windows 7 (Panneau de configuration -> Affichage). Il permet de modifier la taille du texte et d'autres éléments à l'écran. J'ai besoin d'obtenir ce paramètre pour pouvoir activer/désactiver certaines fonctionnalités de mon application C# en fonction de la valeur du paramètre. Est-ce possible?
Réponses
Trop de publicités?Graphics.DpiX et DeviceCap.LOGPIXELSX renvoient 96 sur Surface Pro à tous les niveaux de mise à l'échelle.
Au lieu de cela, j'ai réussi à calculer le facteur d'échelle de cette façon :
[DllImport("gdi32.dll")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
public enum DeviceCap
{
VERTRES = 10,
DESKTOPVERTRES = 117,
// http://pinvoke.net/default.aspx/gdi32/GetDeviceCaps.html
}
private float getScalingFactor()
{
Graphics g = Graphics.FromHwnd(IntPtr.Zero);
IntPtr desktop = g.GetHdc();
int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES);
int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES);
float ScreenScalingFactor = (float)PhysicalScreenHeight / (float)LogicalScreenHeight;
return ScreenScalingFactor; // 1.25 = 125%
}
Le moyen le plus simple à mon avis est d'utiliser la fonction GetDeviceCaps
. Depuis pinvoke.net :
[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
public static extern int GetDeviceCaps(IntPtr hDC, int nIndex);
public enum DeviceCap
{
/// <summary>
/// Logical pixels inch in X
/// </summary>
LOGPIXELSX = 88,
/// <summary>
/// Logical pixels inch in Y
/// </summary>
LOGPIXELSY = 90
// Other constants may be founded on pinvoke.net
}
Et utilisation :
Graphics g = Graphics.FromHwnd(IntPtr.Zero);
IntPtr desktop = g.GetHdc();
int Xdpi = GetDeviceCaps(desktop, (int)DeviceCap.LOGPIXELSX);
int Ydpi = GetDeviceCaps(desktop, (int)DeviceCap.LOGPIXELSY);
Dans cette approche, vous n'avez pas besoin de marquer votre application comme compatible dpi.
C'est ainsi que vous pouvez le faire dans WPF. La valeur de retour est dans les unités logiques de WPF, qui sont égales à 1/96e de pouce. Donc, si votre écran DPI est réglé sur 96, vous obtiendrez une valeur de 1.
Matrix m =
PresentationSource.FromVisual(Application.Current.MainWindow).CompositionTarget.TransformToDevice;
double dx = m.M11; // notice it's divided by 96 already
double dy = m.M22; // notice it's divided by 96 already
( source )