Не секрет, что внедрение высокого разрешения экранов идет быстрее, чем адаптация Windows программ под них. Проблемы появляются в первую очередь тогда, когда нам надоедает напрягать глаза и пользоваться увеличительными стеклами, и мы изменяем масштабирование системы. Программы можно разделить на три категории по тому, как они ведут себя при этом:
- Все элементы программы масштабируются правильно
- Только некоторые элементы масштабируются правильно
- Программа говорит Windows, что не умеет масштабироваться, и тогда операционная система сама масштабирует всю программу как умеет (в результате чего мы и видим замыленный интерфейс во многих старых программах)
Самый неприятный вариант для пользователя — это конечно же второй. Он может не только сделать программу неудобной для использования, но и вообще сделать пользование невозможным.
Ниже я покажу на примере QTIPlot как это можно исправить.
QTIPlot — это программа, главная функция которой (как ясно из названия) — это построение графиков. Также она использует Qt, который и говорит операционной системе, что умеет сам масштабировать. Но к сожалению что-то идет не так и в результате графики, созданные и старательно выравненные на системе с масштабированием, теряют всю свою гармонию если их открыть на системе без масштабирования — шрифты начинают расползаться и т.п. Программа эта вроде как open source (хотя и надо обладать некоторыми детективными навыками, чтобы найти ее код), но с наскока мне исправить ее не удалось. Поэтому я расценил, что лучше жить с замыленным интерфейсом, чем искать замену программе, и решил заставить программу говорить Windows, что она не умеет масштабироваться.
Для этого надо создать манифест-файл в той директории, где находится exe-файл, который мы хотим изменить, со следующим содержанием:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker"
uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet"
version="1" ID="Custom" SameSite="site" />
</applicationRequestMinimum>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
</application>
</compatibility>
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>false</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</asmv1:assembly>
(главное для нас здесь — это конечно же
<dpiAware>false</dpiAware>
).
После этого надо запустить «Developer Command Prompt» из Visual Studio Tools, перейти в эту директорию и выполнить команду
mt.exe -nologo -manifest qtiplot.exe.manifest -outputresource:qtiplot.exe
(естественно «qtiplot.exe» надо заменить на название того exe-файла, который надо пропатчить).
Вот и всё, можно запускать программу и радоваться теплому замыленному интерфейсу с правильным масштабированием.
Приятный бонус этих танцев с манифестом в том, что так можно исправить даже те программы, к которым у нас нет source кода.
PS После того как написал эту публикацию, заметил, что слово «скалирование» не входит в современные орфографические словари. Пришлось заменить его везде на «масштабирование». По этому поводу ниже опрос.
Автор: dannk