Да здравствует мыло душистое, или как исправить неправильное масштабирование Windows программ

в 15:58, , рубрики: GUI, highdpi, qt, usability, Visual Studio, windows, грязные хаки, масштабирование, Программирование, разработка под windows, скалирование

Не секрет, что внедрение высокого разрешения экранов идет быстрее, чем адаптация Windows программ под них. Проблемы появляются в первую очередь тогда, когда нам надоедает напрягать глаза и пользоваться увеличительными стеклами, и мы изменяем масштабирование системы. Программы можно разделить на три категории по тому, как они ведут себя при этом:

  • Все элементы программы масштабируются правильно
  • Только некоторые элементы масштабируются правильно
  • Программа говорит Windows, что не умеет масштабироваться, и тогда операционная система сама масштабирует всю программу как умеет (в результате чего мы и видим замыленный интерфейс во многих старых программах)

Самый неприятный вариант для пользователя — это конечно же второй. Он может не только сделать программу неудобной для использования, но и вообще сделать пользование невозможным.
Ниже я покажу на примере QTIPlot как это можно исправить.

QTIPlot — это программа, главная функция которой (как ясно из названия) — это построение графиков. Также она использует Qt, который и говорит операционной системе, что умеет сам масштабировать. Но к сожалению что-то идет не так и в результате графики, созданные и старательно выравненные на системе с масштабированием, теряют всю свою гармонию если их открыть на системе без масштабирования — шрифты начинают расползаться и т.п. Программа эта вроде как open source (хотя и надо обладать некоторыми детективными навыками, чтобы найти ее код), но с наскока мне исправить ее не удалось. Поэтому я расценил, что лучше жить с замыленным интерфейсом, чем искать замену программе, и решил заставить программу говорить Windows, что она не умеет масштабироваться.

Для этого надо создать манифест-файл в той директории, где находится exe-файл, который мы хотим изменить, со следующим содержанием:

qtiplot.exe.manifest

<?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-файла, который надо пропатчить).
Вот и всё, можно запускать программу и радоваться теплому замыленному интерфейсу с правильным масштабированием.
Да здравствует мыло душистое, или как исправить неправильное масштабирование Windows программ - 1

Приятный бонус этих танцев с манифестом в том, что так можно исправить даже те программы, к которым у нас нет source кода.

PS После того как написал эту публикацию, заметил, что слово «скалирование» не входит в современные орфографические словари. Пришлось заменить его везде на «масштабирование». По этому поводу ниже опрос.

Автор: dannk

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js