Объявление высокой осведомленности о DPI для каждого окна в Windows 8

Я разрабатываю аудио-плагины, которые работают на хосте, таком как Cubase, и хочу добавить поддержку High DPI. Это проблематично, потому что все хост-приложения, о которых я знаю, объявляют себя не поддерживающими высокий DPI, поэтому DWM автоматически масштабирует все окна. Я ищу способ отключить масштабирование DWM DPI для окна плагина, даже если сам хост не поддерживает DPI (поэтому он использует масштабирование DWM DPI для всех других окон). Кто-нибудь знает, возможно ли это вообще?

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

Если в настоящее время это невозможно сделать, есть ли способ связаться с инженером Microsoft, чтобы его можно было добавить в будущую версию Windows?


person Frederik Slijkerman    schedule 30.10.2014    source источник
comment
comment
Отличная ссылка, но, к сожалению, в ней участвует лишь несколько продуктов Microsoft. Насколько я понимаю, для Windows вообще ничего нет.   -  person Frederik Slijkerman    schedule 30.10.2014
comment
Осведомленность о DPI распространяется на весь процесс, а не на окно, потому что, когда вы вызываете GetCursorPos(), как система узнает, с каким DPI окна обращаться? Параметр дескриптора окна отсутствует. Проблема неразрешима.   -  person Raymond Chen    schedule 30.10.2014
comment
Спасибо Раймонд. Я думаю, исходящий от вас, это должен быть определенный ответ. :-) Если вы опубликуете это как ответ, я приму это.   -  person Frederik Slijkerman    schedule 04.11.2014
comment
Я ожидаю, что, поскольку реализация Windows 8.1 представляет собой такой беспорядок, что даже панель управления Windows 8.1 не поддерживает распознавание DPI для каждого монитора, без множества сбоев, все это будет снова перестроено в Windows 10. О, весело. Ради интереса попробуйте взять окно «Разрешение экрана» и перетащить его с монитора с разрешением 96 dpi на монитор с разрешением 150+ dpi и обратно.   -  person Warren P    schedule 11.11.2014
comment
Я согласен с тем, что поддержка каждого монитора на самом деле не была продумана. По какой-то причине, например, заголовок окна не масштабируется, что выглядит довольно глупо. Apple действительно сделала все правильно со своей поддержкой Retina.   -  person Frederik Slijkerman    schedule 13.11.2014
comment
Можно ли внедрить ваш плагин вне процесса? Если у вас есть разделение процессов (даже с общим HWND), ваша проблема разрешима.   -  person morechilli    schedule 04.08.2016
comment
Это действительно способ решить эту проблему с поддержкой хост-приложений.   -  person Frederik Slijkerman    schedule 12.08.2016
comment
См. следующие строки из msdn (msdn.microsoft.com/en-us/library/windows/desktop/). Предыдущие версии Windows требовали, чтобы вы устанавливали осведомленность о DPI для всего приложения. Теперь осведомленность о DPI привязана к отдельным потокам, процессам или окнам. В нем ясно сказано, что можно установить осведомленность о DPI для каждого окна. Нам просто нужно выяснить, как.   -  person Sahil Singh    schedule 21.12.2016


Ответы (2)


После юбилейного обновления Windows 10 теперь возможно определение DPI для каждого окна. Новый API SetThreadDpiAwarenessContext( ) можно использовать для установки поддержки DPI для каждого окна и потока. Это достигается следующим образом.

  • Теперь поток может динамически изменять свою осведомленность о DPI.
  • Осведомленность о DPI окна, созданного потоком, будет зависеть от осведомлённости о DPI вызывающего потока во время создания окон.
  • Когда вызывается процедура Windows для окна, поток автоматически переключается на контекст осведомленности о DPI, который использовался при создании окна.

Прочтите следующие ссылки.

person Sahil Singh    schedule 23.12.2016
comment
Интересный пост в блоге здесь: blogs.windows.com/buildingapps/2016/10/24/ - person Frederik Slijkerman; 10.01.2017

Вам не повезло здесь. Осведомленность о DPI — это параметр, распространяющийся на весь процесс. В Windows 8.1 вы можете объявить процесс с учетом DPI для каждого монитора.

И, как заметил Рэймонд выше, никакие инженерные разработки не позволят функциям API, таким как GetCursorPos, учитывать DPI для каждого окна, поскольку такие функции не являются переданными окнами.

person David Heffernan    schedule 30.10.2014
comment
Возможно, вы захотите включить примечание Рэймонда, я бы сказал, что это решающий аргумент. - person Hans Passant; 31.10.2014
comment
Что ж, приложения с плагинами не обязательно являются устаревшими приложениями. Но я понимаю, что здесь нет простого решения. - person Frederik Slijkerman; 04.11.2014
comment
Я этого не говорил. Я имею в виду приложения, которые не будут перестраиваться с учетом dpi. - person David Heffernan; 04.11.2014