Wie kann ich Windows 8.1 darauf aufmerksam machen, dass meine Delphi-Anwendung Pro Monitor DPI unterstützen möchte?

Ich habe versucht, Windows 8.1 dazu zu bringen, eine Delphi XE6-Anwendung (ein Demo-Programm) zu erkennen, die ich zu erstellen versucht habe, und habe festgestellt, dass meine Anwendung DPI-fähig ist, und zwar ausschließlich anhand der Manifest-Technik. Delphi XE6 (und alle anderen, ebenfalls aktuellen Versionen von Delphi) machen das Hinzufügen eines Manifests in Project Options einfach.

Dies ist der .manifest-Inhalt, den ich mithilfe von MSDN-Ressourcen ermittelt habe. Ich vermute, es könnte etwas falsch sein.

Wenn Sie dieses Manifest testen möchten, erstellen Sie eine leere VCL-Anwendung, verwenden Sie diesen Inhalt als Manifest und fügen Sie den Code hinzu (der Code ist derzeit meiner Antwort auf diese Frage beigefügt).

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <!-- Per Monitor DPI Awareness in Windows 8.1 uses asmv3:application + asmv3:windowsSettings -->
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>True</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>

  <!-- Dear Microsoft, Don't Lie to Me About What Version of Windows I am On -->
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- Windows Vista and Windows Server 2008 -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
      <!-- Windows 7 and Windows Server 2008 R2 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
      <!-- Windows 8 and Windows Server 2012 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
      <!-- Windows 8.1 and Windows Server 2012 R2 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
    </application>
  </compatibility>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        processorArchitecture="*"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        />
    </dependentAssembly>
  </dependency>
</assembly>

Hat jemand das zur Arbeit bekommen? Was ich finde ist, dass das obige nicht erkannt wird. Wenn ich @ anruSetProcessDPIAwareness(Process_Per_Monitor_DPI_Aware)rst @, dann @ anrufGetProcessDPIAwareness(hProc,Awareness), Ich bekomme das nötige @ zurüAwareness = Process_Per_Monitor_DPI_Aware, aber ich habe gelesen, dass dieser Ansatz potenzielle Nachteile hat, und daher würde ich einen funktionierenden Ansatz vorziehen, der nur auf Manifest basiert.

Wenn ich rufeGetProcessDPIAwareness(hProc,Awareness), Ich erhalte "Awareness = Process_DPI_Unaware" zurück.

Meine andere Sorge ist, dass sie in den MSDN-Quellen das Hinzufügen eines zusätzlichen Manifests angeben. Ich verwende die IDE von Delphi XE6, um EIN und NUR EIN Manifest in meiner Anwendung zu verknüpfen. Ich habe noch nie bemerkt, dass das Hinzufügen eines zusätzlichen Manifests im Vergleich zu nur einem jemals ein Problem war, außer dass das .manifest-Verwaltungssystem in Visual Studio 2010 möglicherweise lahm war. Aus diesem Grund gab es den Tipp und er hat keine Relevanz für andere IDEs /Sprachen

In Visual Studio 2013 gibt es ein Kontrollkästchen direkt in den Projektoptionen, aber ich habe kein Visual Studio 2013, sodass ich ein funktionierendes .manifest nicht untersuchen kann.

aktualisieren

Hier ist ein weiterer Schuss auf ein Manifest:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

Das obige Mini-Manifest ändert das Verhalten der Anwendung, aber nicht genau so, wie ich es wollte. Mit dem obigen winzigen Manifest wird der DPI-Bekanntheitsgrad von OLD Windows 8.0 / Windows 7 / Vista erkannt.

update 2:

Danke Remy für die Ideen. Interessanterweise scheint das Folgende gültig genug zu sein, um einen Anwendungsstart zu ermöglichen. Das Mischen der SMI / 2005-Syntax mit der obigen führte jedoch zu einem Fehler beim gleichzeitigen Starten. Sie können sehen, dass Microsoft ihre Manifeste ziemlich häufig überprüft hat. Beachten Sie, dass das Folgende mein Problem nicht wirklich löst, aber es eine weitere "potenzielle Basisform" bietet, die möglicherweise der tatsächlichen Lösung nahe kommt:

 <assembly xmlns="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0" >
  <application>
    <windowsSettings xmlns="http://schemas.microsoft.com/SMI/2011/WindowsSettings">
      <dpiAware>true</dpiAware>
    </windowsSettings>
  </application>
</assembly>

update 3:

CODE RED ALERT! VERWENDEN SIE NICHT das folgende OS COMPATIBILITY-Flag in einer Delphi VCL-Anwendung:<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>. Microsoft hat BROKEN MOUSE CAPTURE VERHALTEN, BROKEN WINDOW PAINTING auf schreckliche Weise, die ich nicht einmal ahnen konnte. Das Aktivieren dieses Flags führte zu sehr subtilen Fehlern in meiner Anwendung, einschließlich Problemen beim Zeichnen, Unfähigkeit, auf Steuerelemente zu klicken (Meldungen mit gedrückter Maustaste, die die Steuerelemente nicht erreichen, da die Mauserfassung verloren gegangen ist) und vielen anderen Problemen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage