Я попытался заставить Windows 8.1 распознавать приложение Delphi XE6 (демонстрационную программу), которое я пытался создать, и признать, что мое приложение поддерживает Per-Monitor DPI, чисто техникой манифеста. Delphi XE6 (и все другие аналогичные версии Delphi до последнего времени) делают добавление манифеста легко выполненным, внутри Project Options, и я это сделал.
Это содержимое .manifest, которое я определил с использованием ресурсов MSDN. Я подозреваю, что это может быть немного неверно.
Если вы хотите попробовать этот манифест, сделайте пустое приложение VCL, используйте этот контент в качестве своего манифеста и добавьте код (в настоящий момент код прикреплен к моему ответу на этот вопрос).
<?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>
Кто-нибудь получил это на работу? Я нахожу, что вышеупомянутое не признано. Если я сначала вызываю SetProcessDPIAwareness(Process_Per_Monitor_DPI_Aware)
, а затем вызываю GetProcessDPIAwareness(hProc,Awareness)
, я возвращаю необходимый Awareness = Process_Per_Monitor_DPI_Aware
, но я прочитал, что есть потенциальные недостатки этого подхода, и поэтому я предпочел бы работать только с Manifest-only.
Если я назову GetProcessDPIAwareness(hProc,Awareness)
, я вернусь "Awareness = Process_DPI_Unaware".
Мое другое беспокойство заключается в том, что в источниках MSDN они указывают добавление ADDITIONAL манифеста. Принимая во внимание, что я использую способность Delphi XE6 IDE связывать ONE и ONLY ONE в моем приложении. Я никогда не замечал, что добавление какого-либо дополнительного манифеста по сравнению с тем, что только один из них когда-либо был проблемой, за исключением того, что, возможно, система управления .manifest в Visual Studio 2010 была хромой, и именно поэтому совет существовал и поэтому не имеет отношения к другим IDE/Языки.
В Visual Studio 2013 есть флажок прямо внутри параметров проекта, но у меня нет Visual Studio 2013, поэтому я не могу проверить рабочий манифест.
обновление:
Вот еще один выстрел в манифесте:
<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>
Приведенный мини-манифест изменяет поведение приложения, но не совсем так, как я этого хотел. С приведенным выше маленьким манифестом обнаружен уровень осведомленности OLD Windows 8.0/Windows 7/Vista DPI.
update 2:
Спасибо Реми за идеи. Интересно, что следующее, как представляется, достаточно справедливо, чтобы позволить запуск приложения. Однако смешивание синтаксиса SMI/2005 с указанным выше вызвало ошибку запуска сбоку. Вы можете видеть, что Microsoft несколько раз сбивает свои манифесты. Обратите внимание, что следующее решение на самом деле не решает мою проблему, но оно предоставляет еще одну "потенциальную базовую форму", которая может быть ЗАКРЫТО к реальному решению:
<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>
обновить 3:
КОД КРАСНЫЙ АЛЕРТ! НЕ ИСПОЛЬЗУЙТЕ следующий флаг ОС СОВМЕСТИМОСТИ в любом приложении Delphi VCL:
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
. У Microsoft было БРОКЕННОЕ ПОВЕДЕНИЕ ПОВЕДЕНИЯ МЫШЕЙ, БРОНИРОВАННОЕ ОКНО ЖИВОПИСЬ ужасными способами, о которых я даже не мог догадаться. Включение этого флага вызвало очень тонкие ошибки в моем приложении, в том числе проблемы с рисованием, невозможность щелкнуть элементы управления (мышиные сообщения, не достигающие элементов управления, из-за потери мыши) и многие другие проблемы.