Русские Блоги
Красота обрабатывает руку, чтобы научить вас понять DPI Windows
один, DPI определение
DPI Полное имя dots per inch , То естьТочки за дюйм, Количество пикселей на дюйм на дисплее, Window Вообще по умолчанию 96 dpi Быть 100% Коэффициент масштабирования, Но следует отметить, что значение не может быть реальным физическим значением, но оно просто Windows Один из наших справочных стандартов.
Как настроить DPI Сделает программу, мы увидим больше
Проще говоря, мы можем напрямую понять механизм системы, мы пока не будем обсуждать программу DPI Адаптация, только обсудите, как система настройка 125% Принцип, который программа увеличит в будущем.один Усилитель такой жеПусть наша программа будет выглядеть больше, но программа на самом деле такая большая, но она выглядит визуально в соответствии с настройкой DPI Пропорция увеличена.
Если программа для обсуждения правильная DPI Адаптация, то есть программа воспринимает рабочий стол dpi Стали 125% Тогда программа воспринимается на рабочем столе dpi После изменения программа корректирует свой собственный размер 125% Размер этого изменения не имеет ничего общего с системой. Программа просто воспринимает изменение системного DPI, так что она основана на системном DPI, чтобы адаптироваться к влиянию своего программирования. Это усиление уровня программы, поэтому, если сама программа воспринимает системную DPI, программа, которую мы видим, не просто размыта в разрешении 125%.Может быть, на самом деле больше пикселей становится все больше(Существуют также процедурные представления о том, что после того, как DPI системы составляет 125%, но все же сохраняет свой собственный интерфейс программы до 100%, такой как версия настольного настольного настольного стола Life и Death Sniper).
Например, понять, в Win10 Под системой наш родной DPI за 100% , Затем перейдите, чтобы измерить размер окна 100*100 Если мы поместим это в это время DPI Установить как 200% Мы узнаем Визуальное окно удвоится , Но детали окна размыты Это потому, что система используется DWM ( Desktop Window Manager ) Механизм виртуализации Помогите программе адаптироваться к высокому разрешению.
DPI Пропорция соответствует соответствующей взаимосвязи между количеством точек:
Соотношение экрана
Точки за число
Примечание: вышеуказанное количество баллов является кодом в коде. DPI Числа часто используются в проблемах
В -третьих, разные системы DWM механизм
Система dpi Улучшение можно разделить на три периода времени
1. Стадия WindowsXP:
Высокая DPI Поддержка плохая, большая часть случая является расширенным шрифтом, конечно, наша программа может пройти GetDeviceCaps(hDC, LOGPIXELSX) Получать DPI Позже, содержание картины было увеличено. Поскольку это сейчас недоступно, обсуждения не обсуждаются.

2. Windows Vista/Windows 7/Windows 8 сцена:
существует Windows Vista / 7 / 8 В, операционная система предоставляет реальную DPI параметр:

Windows 7 Это также обеспечивает дополнительную традицию Windows XP стиль DPI Варианты соотношения зум (этот вариант Windows 8 Удалить его позже), это также модифицируется DPI Значение, но вы можете выбрать не -1/4 целочисленное время DPI ценность.

Под приведенной выше системой мы можем запретить DWM Мы называем эту модель как Basic Режим в этом режиме высокая DPI Эффект и XP Такой же. Как запретить: найти в менеджере обслуживания Desktop Window Manager Session Manager Этот вариант может быть запрещен, но он не запрещен DWM Модель, мы можем увидеть обсуждаемые выше “ Великолепный “ Эффект
3. Windows 8.1 Последующая стадия
Windows 10 Много -экранный выбор

▲ Windows 10 Много -экранный выбор
Windows 10 Середина на каждом экране DPI настраивать

▲ Windows 10 Середина на каждом экране DPI настраивать
Если пользователь меняет систему в настройках DPI Значение или экран DPI Значение, тогда Windows Системное собрание Попросите, что вам нужно отменить, чтобы подать заявку на изменение 。
За Windows 8.1 Следующая система необходима. потому чтосистема DPI Если значение не отменено, оно не изменится, Приложение должно быть новым после повторного зарегистрированного системы DPI Когда вы цените, вы обычно будете в соответствии с новой системой DPI Значение отображается. В противном случае это такБит -диаграмма системы масштабируется.
За Windows 8.1 Вышеуказанная система обычно необходима. Хотя экран DPI Значение было обновлено, и оно было отправлено в окно приложения Dpi Change Сообщение, но система DPI Значение все еще не изменилось. Приложение должно быть обработано Dpi Change Сообщение будет представлено обычно Сущность Если это применяется Не поддерживайте экран DPI Понимать (Позднее обсуждение), затем система используется DPI Ценность, поэтому такая же будет выполнена системой Бит схема (увеличение).
Но вещи есть Windows 10 (1803) После этого все изменилось снова. Теперь вы можете открыть переключатель в настройках, чтобы вам не нужно было его отменить. Просто откройте приложение, чтобы получить это приложение, чтобы получить последнюю систему DPI Ценность.
Windows 10 (1803) Средний размер “ Не размыто ” Установить элемент

Метод: open “ настраивать ” > “ система ” > “ монитор ” > “ Усовершенствованные настройки масштабирования ” ,существует “ Усовершенствованные настройки масштабирования ” Верхний, открытый “ разрешать Windows Попробуйте отремонтировать приложение, чтобы оно не размыто ” Сущность Дополнительное, для Windows 8.1 Вышеупомянутая система, система DPI Значение, равное экрану основного экрана, когда система запускается DPI ценность.
Четыре, верно Windows Приложение DPI Уровень восприятия ( Dpi Awareness )
Система была сказана выше DPI Операция, давайте снова обсудим приложение для системы dpi Измените метод адаптации. В настоящее время Windows программа DPI Уровень восприятия был обновлен в прошлом, в основном с четырьмя уровнями.
1. DPI Unaware
Как следует из названия, программа правильная систематический DPI Не воспринимается Для самого приложения оно всегда будет 96DPI , Но на системном уровне DPI Во время изменения система непосредственно увеличивает воспринимаемый уровень DWM, который визуально Смутно схема рисования расширена Позиция координат все же. Это Эксплуатация системы эксплуатации Сущность Простое понимание — это приложение, чтобы рассказать системе,Эта программа для DPI Изменение не адаптировано,Ваша операционная система помогает мне адаптироваться к пользователям. Когда эта программа воспринимаемого уровня вызывает API системы для получения DPI системы, она всегда будет получена на 100%, а при вызове API системы, таких как GetWindowRect, столько же, сколько размер, положение, длина и ширина Окно при 100%разрешении системы всегда является окном.
2.System DPI Awareness
Этот уровень программы настроен системой, когда система запускается DPI ,Программа определит это DPI , Тогда на основе этого DPI Приходите и выберите свою собственную программу DPI Признайте, это слой программы Уход за лицом DPI Адаптация, в течение периода инициализации, они Используйте систему DPI Значение соответствующим образом расположено им UI (Управление размером, выберите размер шрифта, ресурсы загрузки и т. Д.). Эта адаптация Не смутно, он выглядит расширенным Вместо этого программа действительно увеличивается, что является операцией программы. Конечно, после того, как некоторые программы получат DPI системы, он может не настраивать DPI своего программного окна с помощью DPI системы, но пусть его программа по -прежнему показывает 100%в случае 125%. Вы можете увидеть жизнь и смерть. Снайпер Micro -End Login в этой игре.
Но предположим, что мы -двойной экран, основной экран 125% Другой экран 150% , Тогда программа начала чувствовать 125% Настольный компьютер DPI , А затем используйте его при инициализациипрограмма 125% Метод инициализации, Но когда программа из 125% Экран движется к 150% Во время экрана программаНе сделаю этого снова 150% ИнициализацияВместоУровень операционной системыиз.
Так что программа этого уровня просто вПри инициализацииПолучите DPI, а затем адаптируйтесь к DPI системы в соответствии с ситуацией вашей собственной программы.
3. PerMonitor
Программа в этом режиме — рассказать системе, не используйте ее мне DWM Увеличить, быть системой DPI Во время изменения отправьте программу для отправки программы WM_DPICHANGED Новости, заявление несет ответственность за себяновый DPI Обработка вашей собственной корректировки размераСущность Большинство настольных приложений используют UI Рамка( Windows Общий контроль ( comctl32 ), Windows Окно, Windows Presentation Framework Он не поддерживает автоматический DPI Масштабирование, Необходимо самостоятельно отрегулировать содержимое окна Размер и вновь откройте его.
4. PerMonitor (V2)
а также Per—Monitor В том же режиме основное отличие — следующие моменты:
- когда DPI Изменение (верхний уровень HWND И ребенок HWND ) Уведомить приложение
- Это приложение видит исходные пиксели каждого дисплея
- Windows Никогда не увеличивайте приложения
- Windows Автоматическое масштабирование не -закустомерная область (заголовок окна, прокатная полоса и т. Д.)
- Win32 Диалоговое окно (от CreateDialog )Зависит от Windows Автоматическое масштабирование DPI
- Общественный контроль (флажок, фон кнопки и т. Д.) DPI Пропорциональный фактор автоматически представлен
существует PerMonitor v2 При запуске в режиме, DPI Во время изменения заявка будет уведомлена. Если приложение не новое DPI Отрегулируйте размер, затем приложение UI Он будет выглядеть слишком маленьким или слишком большим (в зависимости от предыдущего DPI Ценность и новое DPI Разные значения).
Для приложения DPI Уровень восприятия может быть на Win10 Зарегистрироваться менеджера миссии
Откройте диспетчер задач, справа -щелкните панель окон, вы можете вспомнить программу, чтобы отобразить ситуацию, проверить DPI Воспринимать, вы можете увидеть каждую программу подробно DPI Режим восприятия.

Для других более глубоких знаний, пожалуйста, двигайтесь. MSDN High DPI Desktop Application Development on Windows
5. Как установить программу DPI Восприятие и связанное API использовать
Понять вышеупомянутую программу DPI Воспринимать уровень, давайте поговорим о том, как установить программу DPI Уровень восприятия в основном в следующих двух методах: (имя метода — это я в MSDN Скопируйте, перевод очень рожден Тяжело, все понимают это самостоятельно)
- through an application manifest setting
- programmatically through an API call
Здесь мы в основном объясняем второй метод, используя windows который предоставил API Настройки настроены программированием DPI Восприятие, хотя Windows не рекомендую Мы делаем это, но в нашем процессе разработки эти API Все еще довольно практично, и другие связанные процедуры DPI Воспринимается API объяснять.
Эти API Есть три версии итерации, поэтому SetProcessDpiAwarenessContext Серия является примером
Fullscreen Borderless is broken for me
![]()
As the title states, Fullscreen Borderless in both window and keep res modes is unusable for me, and I can’t seem to figure out what’s causing it. I’ll list my symptoms below, as well as link a couple Youtube videos showing them in detail:
- Standard Fullscreen works fine, although from time to time, when I alt+tab, I get a bug where the game seems to freeze and my entire Windows desktop other than my taskbar becomes unclickable until I close MTA, so I used to prefer playing in Borderless mode for instant alt+tabbing with no risk of the game freezing up my desktop, but that’s no longer possible for me.
- When I launch MTA in either Borderless mode (at 1920×1080 resolution), the entire screen goes black as normal, but when the GTA:SA splash screen pops in, it’s at a lower resolution, seems to be at about 1280×720 or so and crammed up into the top left corner of my screen, then when it gets past the splash screen and into the MTA menu, the entire menu screen gets stretched out far more than it should horizontally, sending about 1/5th of the right side of the MTA window into the right, into my secondary monitor.
- In the menu, I am unable to move my mouse cursor further right or below the area the GTA:SA splash screen was shown in when I originally launched MTA.
Here’s a couple videos I took that show everything I described above, as well as attempts to try anything that might help the issue with no success. My apologies for the poor microphone quality and background noise:
Зачем DPI aware портит нам жизнь?
Вот жили не тужили много лет с нормальными мониторами и не ведали всех этих ужасов DPI aware.
В один прекрасный момент появился кто-то сильно умный и решил,
что пискелы слишком большие и надо бы их пожать.
Казалось бы, ну пожали, ну и черт с ним, один хрен программируя гуйню мы орудуем как правило абстрактными попугайчиками (пикселами).
Но нет же, нужно было добавить разработчику лишней головной и/или попной боли, ввели понятие DPI aware.
Кто-то свыше решил, что теперь разработчик должен программировать гуйню в дюймах и переводить в пикселы (которыми оперируют функции системного апи) вручную.
В результате имеем то, что имеем — кривое говно, где за частую даже нельзя точно определить действительный размер гуй-элемента в физических попугайчиках.
А вот, например, в windows, есть еще очень неприятный момент — системный курсор, который всегда в физических пикселах,
и не зависит от выставленного в системе DPI скейлинга.
Такие дела, как вы боретесь с этим всем?
Я вот тупо решил игнорировать DPI скейлинг совсем и делать приложение по старинке,
если мелкософты накосячили, то я не хочу за них расхлебывать это дерьмо.
Вот кстати не пойму, накой надо было уменьшать пикселы, неужели кому-то они казались слишком большими?
Интересно, они уже починили отот баг, когда ты через SetCursorPos ставишь курсор в одно место (в центр), а он из-за всех этих dpi преобразований оказывается в другом (плюс/минус один пиксель), из-за чего игры, в которых мышь обрабатывается через Set(Get)CursorPos, сломалось (камера начинает крутиться).
nes
> Вот кстати не пойму, накой надо было уменьшать пикселы, неужели кому-то они
> казались слишком большими?
а) они были слишком большие.
б) как бы никогда у пикселя небыло прям вот чёткого размера на всех мониторах, просто раньше разница в десктоп сегменте была не в разы.
>б) как бы никогда у пикселя небыло прям вот чёткого размера на всех мониторах, просто раньше разница в десктоп сегменте была не в разы.
Вроде как он был примерно одинаковым на всех старых мониторах и равнялся примерно 96 pixels / inch.
nes
> Вроде как он был примерно одинаковым на всех старых мониторах и равнялся
> примерно 96 pixels / inch.
или 72 пикселя/дюйм? 🙂
ну ты сам должен понимать что 1024х768 на 14 дюймах и на 17 дюймах это разные вещи. Это конечно не фуллхд или 4к на 24 дюймах, но всё равно разница была и была ощутима.
nes
> В один прекрасный момент появился кто-то сильно умный и решил,
> что пискелы слишком большие и надо бы их пожать.
> не пойму, накой надо было уменьшать пикселы, неужели кому-то они казались
> слишком большими?
Нужно.
Недавно я купил 4к монитор.
До его появления я также думал что 4к не нужно.
А теперь, когда я оказываюсь перед фулашди мониторами я понимаю — в фулашди всё очень плохо.
> DPI скейлинг
Он был сделан для старых программ. Скейлинг их растягивает и мылит.
Решение очень простое.
В свойствах программы поставить галочку отключить это растягивание.
Согласен с тем что скейлинг старых прог — ошибка майкрософта. Но оно легко отключается, ты просто один раз ставишь галочку в свойствах такой проги и всё. Никакого мыла.
SuperInoy
Ну вот мне на работе выдали 24 дюймовый монитор с разрешением 3840×2160,
но на нем не реально работать, если не поставить скейлинг 150% (который как не удивительно является рекомендуемой настройкой в системе).
Ну вот на кой хрен мне столько пикселов тут?
nes
> Ну вот на кой хрен мне столько пикселов тут?
чтобы в пейнте на линии в 1 пиксель не видеть лесенку.
nes
> Ну вот мне на работе выдали 24 дюймовый монитор с разрешением 3840×2160,
Объясни им что тебе неудобно, фуллхд моник за 8к тебе вероятно вместо него выдадут 🙂
122
Галочка не спасет ровно никак.
Поставь ее, запусти приложение, затем поменяй в системе DPI скейлинг,
окно измет размер.
122
Короче работает павильно, если вызвать функцию:
А это чудо доступно только в windows 10.
nes
> Кто-то свыше решил, что теперь разработчик должен программировать гуйню в
> дюймах и переводить в пикселы (которыми оперируют функции системного апи)
> вручную.
В общем-то не кто-то свыше, а просто внедрили типографские стандарты в отображение текстовой информации на компьютерной технике. Просто у Windows, изначально не всё было хорошо с этим делом и старые нехорошие API до сих пор не выпилили. А вот MacOS X изначально пилилась под типографские стандарты и там нет таких проблем (но это не точно).
nes
> Короче работает павильно, если вызвать функцию:
>
> SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);
> А это чудо доступно только в windows 10.
А в вин ниже 10 делай пиксель пёрфект без масштабирования. Ибо нефиг сидеть на говне мамонта и при этом покупать 8к мониторы.
SuperInoy
Некоторые утверждают, что семерка лучше десятки, но это уже отдельная тема для холивара.
nes
> Некоторые утверждают, что семерка лучше десятки, но это уже отдельная тема для
> холивара.
Ну я так утверждаю, но накатывать 7-ку на свежее железо всё равно не вижу смысла. А на не свежем будет фуллхд/2к с соответствующей диагональю(за исключением некоторых ноутов с хайдпи экранами)
How can I set the dpiAware property in a Windows application manifest to "per monitor" in Visual Studio?
I need to be able to set the dpiAware property in the manifest of my application to «per monitor». The available choices in the properties are just to enable or disable DPI awareness. Neither of these settings works for me. I can get the behavior I want for my application if I don’t embed the manifest in the exe, then edit the manifest manually. I want to automatically generate and embed the manifest. Is there something I am missing? (I am using Visual Studio 2013.)
3 Answers 3
New in Windows 10 is dpiAwareness as well as dpiAware, so we need to update this example a bit. Now, it is fine because if dpiAwareness does not exist, then the settings will be inherited from dpiAware.
To enable DPI awareness in full, with the latest Win10 support (see Ref URL for other possible options), which includes ‘permonitor‘ and ‘permonitorv2‘, which I will use instead of ‘system’ because your question asks it.
To disable, you’d do the opposite (no need for dpiAwareness since we don’t support it):
Then there is even ‘gdiScaling’ if you happen to use GDI objects to paint some of your own stuff.
Reference: Microsoft on DPI Awareness as of latest Windows 10 build (also has tutorials on how to make your code DPI aware, even if it is a little tedious for larger projects)