Maison >développement back-end >C++ >Pourquoi mon application DPI-UNAWARE devient-elle soudainement DPI-AWARE après une mise à jour?

Pourquoi mon application DPI-UNAWARE devient-elle soudainement DPI-AWARE après une mise à jour?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-28 08:56:10788parcourir

Why Does My DPI-Unaware Application Suddenly Become DPI-Aware After an Update?

Modifications inattendues de sensibilisation au DPI après les mises à jour de l'application

Certaines applications, conçues à l'origine comme DPI-UNAWARE (en s'appuyant sur la mise à l'échelle de l'interface utilisateur de Windows), peuvent devenir inattendues DPI-AWARE (System Aware) après des mises à jour mineures. Cela se produit même si la manifeste de l'application et les dépendances externes restent inchangées.

Cause profonde:

Ce comportement est souvent causé par des composants ou des dépendances tiers Aware Aware. Même avec une déclaration explicite DPI-UNAWARE dans le manifeste de l'application, l'inclusion de ces composants peut remplacer le paramètre, forçant la conscience de la DPI.

Solutions pour définir la sensibilisation au DPI:

Plusieurs approches peuvent contrôler explicitement la sensibilisation au DPI d'une application:

1. Modification du manifeste des applications:

  • Modifier app.manifest pour inclure (ou décomancement) ce qui suit:
<code class="language-xml"><dpiaware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</dpiaware></code>

2. Utilisation des fonctions de l'API Windows:

L'appel API approprié dépend de la version Windows:

  • Windows 7:
<code class="language-csharp">[DllImport("user32.dll", SetLastError = true)]
static extern bool SetProcessDPIAware();</code>
  • Windows 8.1:
<code class="language-csharp">[DllImport("shcore.dll")]
static extern int SetProcessDpiAwareness(ProcessDPIAwareness value);

enum ProcessDPIAwareness
{
    DPI_Unaware = 0,
    System_DPI_Aware = 1,
    Per_Monitor_DPI_Aware = 2
}</code>
  • Windows 10 (1703 et plus tard):
<code class="language-csharp">[DllImport("user32.dll", SetLastError = true)]
static extern int SetProcessDpiAwarenessContext(DpiAwarenessContext value);

enum DpiAwarenessContext
{
    Context_Unaware = (DPI_AWARENESS_CONTEXT)-1,
    Context_SystemAware = (DPI_AWARENESS_CONTEXT)-2,
    Context_PerMonitorAware = (DPI_AWARENESS_CONTEXT)-3,
    Context_PerMonitorAwareV2 = (DPI_AWARENESS_CONTEXT)-4
}</code>

3. En utilisant AssemblyInfo.cs:

Ajoutez cet attribut pour remplacer la conscience DPI définie par le système basé sur les références de composants:

<code class="language-csharp">[assembly: System.Windows.Media.DisableDpiAwareness]</code>

Considérations importantes:

  • La conscience du DPI est spécifique au fil. Utilisez des fonctions d'API spécifiques au thread pour le contrôle granulaire sur les threads individuels.
  • Assurez-vous que tous les composants et dépendances tiers sont cohérents avec le niveau de sensibilisation au DPI souhaité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn