Столкнулся с очередным детективом в разработке 😱
Над этой проблемой я бился уже очень очень долго, периодически возвращался к ней, но безрезультатно.
Задача: определить масштабирование для каждого монитора в системе (т.е. 100%, 125% и т.д.)
Это нужно для того, чтобы правильно размещать элементы TurboConf в конфигураторе 1С.
Задача непростая. Как таковой готовой функции в WinApi и .NET нет. В последних версиях .NET появилось что-то похожее, но работает только для Windows 10 и выше, и то не на всех билдах и в определенных условиях.
Для Window 7 свой метод получения, для 8 тоже, для 10 разных версий тоже, ну и для 11 конечно по своему. А еще есть разные флаги, которые тоже влияют на это, в общем как обычно.
Получилось написать библиотеку, которая должна вроде работать во всех случаях. Если возможно она получает виртуальное разрешение монитора и сравнивает с реальным, если нет то другими способами, вплоть до реестра с разными ключами.
Но она никак не работала в TurboConf...
В этот раз я решил не сдаваться и довести дело до конца. 🔍
Чтобы способ заработал, приложению нужно выйти из песочницы. Для этого требуется настроить манифест программы, чтобы система знала, что можно отдавать реальный DPI приложению, а не виртуальный.
Добавил манифест - не заработало.
Я создал тестовое приложение из одной формы и манифестом. Тоже.
Я выяснил, что для моего типа приложений (WinForms) оказывается нужен не манифест, а app.confg. ОК.
Не заработало.
Попробовал на тестовом приложении с app.confg - работает! Интересно.
Я начал сравнивать и менять все настройки приложений на одинаковые. Не помогает.
Я начал удалять из проекта все что можно, все зависимости, библиотеки т.д. Безрезультатно.
Я удалил практически все, оставил одну форму как в тестовом. Результат тот же.
Я заменил форму, файл проекта полностью и т.д. из тестового. Приложения уже были полностью идентичны. Но нет.
Я создал, новую чистую папку для проекта, и заново собрал - не работает. 😥
В чем же дело?! Это были две полностью одинаковые копии, кроме одного различия...
Названия сборки!
Одно называлось TestDpi.exe, а второе TurboConf.Application.exe
Убираю точку из названия и все работает!!! 😅
Что это было??? Из-за точки в названии я никак не мог долгое время заставить работать функцию! Мораль - никогда не сдавайтесь!
В общем хеппи энд, работаем дальше... 😉
Post #121
392

- 🔥 16
- 👍 9
- 🤯 2
- ❤ 1
- 👾 1