Ich habe versucht, Windows 8.1 eine Delphi XE6-Anwendung (ein Demo-Programm) erkennen zu lassen, die ich zu bauen versuche, und habe erkannt, dass meine Anwendung Per-Monitor DPI-bewusst ist, rein durch die Manifest-Technik. Delphi XE6 (und alle anderen ähnlich aktuellen Versionen von Delphi) machen das Hinzufügen eines Manifests zu einem Kinderspiel, innerhalb von Projektoptionen, und ich habe es getan.Wie kann ich Windows 8.1 darauf aufmerksam machen, dass meine Delphi-Anwendung Per Monitor DPI unterstützen soll?
Dies ist der Manifest-Inhalt, den ich mithilfe von MSDN-Ressourcen ermittelt habe. Ich vermute, dass es leicht falsch sein könnte.
Wenn Sie dieses Manifest ausprobieren möchten, erstellen Sie eine leere VCL-Anwendung, verwenden Sie diesen Inhalt als Ihr Manifest, und fügen Sie den Code hinzu (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 gebracht? Was ich finde, ist, dass das oben genannte nicht erkannt wird. Wenn ich SetProcessDPIAwareness(Process_Per_Monitor_DPI_Aware)
zuerst anrufen, dann GetProcessDPIAwareness(hProc,Awareness)
anrufen, bekomme ich das notwendige Awareness = Process_Per_Monitor_DPI_Aware
zurück, aber ich habe gelesen, dass es mögliche Nachteile zu diesem Ansatz gibt, und so würde ich einen Arbeitsmanifest-only Ansatz bevorzugen.
Wenn ich GetProcessDPIAwareness(hProc,Awareness)
aufrufen, bekomme ich zurück "Awareness = Process_DPI_Unaware".
Meine andere Sorge ist, dass in den MSDN-Quellen angeben, ein zusätzliches Manifest hinzufügen. Hingegen benutze ich die IDE von Delphi XE6, um ONE und ONLY ONE manifest in meine Anwendung zu integrieren. Ich habe nie bemerkt, dass das Hinzufügen eines zusätzlichen Manifests im Vergleich zu nur einem Problem jemals ein Problem war, abgesehen davon, dass das Manifest-Managementsystem in Visual Studio 2010 möglicherweise lahm war und daher der Tipp existierte und somit keine Relevanz für andere IDEs hat /Sprachen.
In Visual Studio 2013 gibt es ein Kontrollkästchen direkt in den Projektoptionen, aber ich habe kein Visual Studio 2013, so dass ich ein funktionierendes Manifest nicht untersuchen kann.
Update:
Hier ist ein weiterer Schuss auf einem 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 kleinen Manifest wird der OLD Windows 8.0/Windows 7/Vista DPI-Erkennungsgrad erkannt.
Update 2:
Dank Remy für die Ideen. Interessanterweise scheint das Folgende ausreichend zu sein, um einen Anwendungsstart zu ermöglichen. Das Mischen der SMI/2005-Syntax mit dem oben genannten verursachte jedoch einen Side-by-Side-Startfehler. Sie können sehen, dass Microsoft auf ihren Manifesten ziemlich viel aufgewühlt hat. Beachten Sie, dass die folgenden nicht wirklich mein Problem lösen, aber es bietet noch eine weitere „potentielle Basenform“, die auf die wirkliche Lösung SCHLIEßEN sein könnte:
<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 in einer Delphi VCL-Anwendung NICHT das folgende OS COMPATIBILITY-Flag: <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
. Microsoft hat ein gebrochenes Mauser-Verhalten, zerbrochenes Fenstergemälde auf schreckliche Weise, die ich nicht mal erraten konnte.Das Aktivieren dieses Flags verursachte sehr subtile Fehler in meiner Anwendung, einschließlich Malproblemen, Unfähigkeit, auf Steuerelemente zu klicken (Maus-Down-Nachrichten erreichten keine Steuerelemente, weil die Mauserfassung verloren ging) und viele andere Probleme.
Zusätzliche Manifeste hinzugefügt z. durch das mt.exe-Tool werden nur in einem einzigen Manifest zusammengeführt (das in der Anwendung sein darf), nicht wahr? Ich glaube, du solltest nur deine App ändern. manifestieren, ohne zu versuchen, mehr von ihnen zu haben. – TLama
Okay, das ist gut zu wissen. Ich vermute, dass ich einige obskure XML/Manifest Metadaten etwas falsch oben habe. –
Ich würde vorschlagen, die Reihenfolge der Top-Level-XML-Elemente zu ändern. Mache die '' zuerst, dann die '' nächste, dann endlich die '' letzte. In dieser Reihenfolge wurden diese Funktionen in Windows eingeführt. XML soll nicht auftragsabhängig sein, kann aber sein, wenn ein XML-Schema verwendet wird. Der Parser von Windows kann auf die Reihenfolge angewiesen sein, es muss möglicherweise das Element Win8.1 '' vorhanden sein, bevor das Element ' 'verarbeitet wird. –