82 votes

Comment obtenir les paramètres d'affichage de Windows ?

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?

90voto

Farshid T Points 31

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%
}

17voto

Anton Semenov Points 3375

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.

17voto

Eternal21 Points 430

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 )

12voto

Kyle Delaney Points 1517

Voici une solution qui fonctionne bien dans Windows 10. Il n'y a pas besoin de sensibilisation DPI ou quoi que ce soit.

 public static int GetWindowsScaling()
{
    return (int)(100 * Screen.PrimaryScreen.Bounds.Width / SystemParameters.PrimaryScreenWidth);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X