Комбинацията от дисплеи с висока плътност и класически настолни приложения доведе до лавина от въпроси: защо Explorer е размазан, как да активирам... Режим с висока разделителна способност на отдалечени клиенти, какво Докоснете „Настройки“ в Windows (коригиране на DPI, мащабиране и резолюция в Windows 11), macOS или Linux и какво трябва да направят разработчиците, за да гарантират, че приложенията им се мащабират и остават адаптивни. Тази статия събира всичко необходимо, за да разберете и отстраните проблема, от най-практичните до най-техническите аспекти.
Ако търсите как да се справите с размазани прозорци, малки менюта на 4K монитор или как да наложите правилно мащабиране на мониторите ултраширок 2560×1080 (например, как изберете резолюция ръчно), попаднали сте на правилното място. В допълнение към потребителските решения, ще разберете какво Осведоменост за PPP/DPI (за всеки монитор, v1 и v2), съвети за манифест и съвместимост, както и специфични насоки за актуализиране на Win32, Windows Forms или WPF приложения.
Какво е Hi-DPI и защо някои приложения изглеждат размазани?
Съвременните екрани концентрират много повече пиксели на инч (ppi/dpi) отколкото преди няколко години (от традиционните 96 DPI до 300 DPI и повече). Когато дадено приложение не може да се адаптира към това увеличение, Windows разширява интерфейса си с растерни изображения, което води до типичното ефект на размазване при мащабиране; в Windows 11 има дори функции като Автоматична супер резолюция които се опитват да подобрят външния вид.
В терминологията на Microsoft, едно приложение може да не е „незапознато“, „системно-осъзнато“ или „осъзнато“ за всеки монитор. Всеки профил определя дали системата мащабира автоматично или дали трябва да се преначертае с новия коефициент на мащабиране. Колкото по-висока е чувствителността на DPI, толкова по-остър ще бъде резултатът при преместване на прозореца между монитори с различни мащабирания.
Случаят с File Explorer и размазани системни приложения
Много потребители срещат, че разделът в C:\Windows\explorer.exe не се показва. съвместимостExplorer е специално обработен системен компонент, така че там няма да видите обичайния панел „Override DPI scaling behavior“ (Преодоляване на поведението при мащабиране на DPI). Ако видите размазан Explorer или контролен панел, проблемът обикновено е в мащабиране на системата (вижте как промяна и регулиране на резолюцията на екрана) върху неадаптирани части от интерфейса.
За да се справи с размазаните приложения като цяло, Windows 10/11 предлага опции като „Нека Windows се опита да поправи приложенията, така че да не са размазани“ и отмяна на мащабирането за всяко приложение. Докато изследовател няма раздел за съвместимост, тези системни функции могат да подобрят цялостното поведение, докато за други приложения можете да приложите специфични замени на мащабирането от техните свойства.
Режими за разпознаване на DPI в Windows
В екосистемата на Windows има ясна класификация на това как едно приложение се справя с мащабирането. Разбирането на това е ключово за диагностициране на причините, поради които даден прозорец изглежда остър на монитор, но... размазано в друг с различен мащабен коефициент.
| Modo | от | Как го вижда ПЧП | Поведение при промяна на DPI |
|---|---|---|---|
| Не е в съзнание | N / A | Винаги 96 PPP (100%) | Мащабиране на растерно изображение (размазано) |
| Системно осъзнаване | Windows Vista | Единична DPI: тази на основния монитор при влизане в системата | Изглежда рязко само при тази DPI; ако смените мониторите/мащабите, Windows уголемяване на растерното изображение (размазано) |
| На монитор (v1) | Windows 8.1 | DPI на монитора, където основно се намира прозорецът | HWND от най-високо ниво получава WM_DPICHANGEDняма автоматично мащабиране на елементите на потребителския интерфейс |
| На монитор v2 | Windows 10 1703 | DPI на активния монитор за всеки прозорец | HWND от най-високо ниво и вторични HWND получават известие; Windows мащабира неклиентската област, диалози и теми от comctl32 V6 автоматично |
В per-monitor v2, приложението никога не се ескалира от системата и трябва преоразмеряване/пречертаване съдържанието му след WM_DPICHANGED. В замяна Windows ви спестява работа върху неклиентските елементи (заглавие, ленти за превъртане), диалоговите прозорци на Win32 и някои контроли с „теми“.
Актуализирайте съществуващо приложение, за да го направите по-ясно
Минималната стъпка е да маркирате процеса като на монитор v2 (манифест или API) и преместете логиката на оформлението извън инициализацията, така че тя да се изпълнява и при промяна на DPI (WM_DPICHANGED). В същото време трябва да преразгледаме нашите предположения: да спрем вечното кеширане на размерите на шрифтовете и стойностите, зависими от DPI; преизчислявам когато мащабът се промени.
Много Win32 API не показват DPI контекст, така че връщат стойности спрямо системния DPI. Препоръчително е класическите извиквания да се заменят с DPI-адаптирани варианти, например, използвайки GetSystemMetricsForDpi вместо GetSystemMetrics и приложете функции като EnableNonClientDpiScaling в WM_NCCREATE.
Смесен режим: Разпознаване на DPI за всяка нишка
Ако приложението ви е голямо или комбинира потребителски интерфейси на трети страни, можете да предприемете поетапен подход: актуализирайте главния прозорец за всеки монитор и оставете вторичните прозорци от най-високо ниво в оригиналния им режим. Ето защо има SetThreadDpiAwarenessContext, което свързва DPI осведомеността с прозорците, създадени, докато този контекст е активен.
Имайте предвид, че смесването на режими увеличава сложността и има правила, чието нарушаване от Windows не е позволено (например, HWND дърво не може да смесва различни съзнания между родител и дете). Ако се отклоните от правилото, системата може да принуди... нулиране на DPI режима на процеса или връщане на грешки като ERROR_INVALID_STATE при повторно родителство.
Основни тестове и често срещани проблеми
Опитайте да местите прозорци между монитори с различни мащаби, като започнете от всеки монитор, променяте коефициента на мащабиране в движение и след това, след като смените основния монитор, излезте и влезте отново за откриване на кеширане на DPI/размер. Добавя тестови пакети за отдалечен работен плот от компютри с висока/ниска DPI резолюция.
Типични проблеми: неизползване на предложения правоъгълник WM_DPICHANGED; виртуализация на стойности, когато нишката не е в DPI контекст правилно; и DPI безконтекстни API, които ви принуждават да зареждате ресурси ръчно (напр. заместване на LoadIcon с LoadImage за подходящи размери).
SSMS на 4K дисплеи: външен манифест и отмяна на мащабирането
SQL Server Management Studio (SSMS) се подобрява, но от известно време поддръжката за Високо DPI Беше частично. Има два ефективни начина: използване на външен манифест и отмяна на мащабирането в Compatibility.
Външен манифест: Създава ключа на системния регистър HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide с ПредпочитанВъншенМанифест=1 (DWORD). Добавете файл ssms.exe.manifest (UTF‑8) заедно с ssms.exe, за да посочите, че е необходима DPI резолюция. Рестартирайте и ще видите по-ясни икони и текст в UHD 3840×2160.
Замяна на мащабирането: В пряк път на SSMS, в раздела „Съвместимост“, отметнете „Замяна на поведението за мащабиране с висока DPI„и изберете „Приложение“. Това принуждава SSMS да се държи като отделно приложение за всеки монитор, предотвратявайки увеличаването му от Windows с растерно изображение при промяна на DPI.
За да одитирате осведомеността за DPI на който и да е процес, Process Explorer (Sysinternals) ви позволява да добавите колона „Осъзнаване на DPI“. Ще видите състояния като Неизвестно (винаги мащабирано от системата), Системно осъзнаване или за всеки монитор. Тази проверка е много полезна, за да разберете какво да очаквате от конкретно приложение.
Координиране на виртуализацията и DPI контекстно-свободните API
Когато приложение или нишка работи като несъзнателна или системно-осъзната, Windows може да виртуализира стойности (напр. размери на екрана), за да „симулира“ 96 DPI, което обърква диагностиката. Уверете се, че нишката работи на DPI контекст очаква се при заявки за показатели или създаване на прозорци и възстановява контекста след използване на SetThreadDpiAwarenessContext.
Много класически API не включват HWND/DPI в сигнатурата си. Примери: при зареждане на икони, използвайте Зареждане на изображение вместо LoadIcon; за показатели използвайте GetSystemMetricsForDpi; за неклиентски, EnableNonClientDpiScaling. Тези типове настройки правят разликата между чист потребителски интерфейс и такъв, при който системата просто се изключва. мащабиране чрез растерно изображение.
Важна забележка: «hidpi.h» не е Hi-DPI
Има HID (Human Interface Device) рутина, наречена Разлика в списъка за използване на HidP_Usage чийто заглавен файл е hidpi.h, което води до объркване с „Hi-DPI“. Този API няма нищо общо с мащабирането на екрана: той се използва за сравняване Списъци за употреба на HID (бутони/входове) и получаване на разлики между предишни и текущи състояния.
Неговата сигнатура връща HIDP_STATUS_SUCCESS и използва буферите PreviousUsageList и CurrentUsageList, като депозира изчезващите употреби в BreakUsageList и тези, които се появяват в MakeUsageList. Нула в списък се интерпретира като разделител. За контекст това принадлежи на СКРИ (клавиатури, геймпадове), а не към света на Hi-DPI дисплеите.
Бърза диагностика с Process Explorer
Ако не сте сигурни как се мащабира дадено приложение, добавете колоната „DPI Awareness“ в Process Explorer. Ще видите състояния като Неизвестно (системата винаги мащабиране), системно-ориентирана (приема първоначалната DPI и не реагира на промените) или за всеки монитор. Тази проверка е полезна, за да решите дали ви е необходим манифест, анулиране на мащабиране или рефакториране на оформлението.
Овладяването на Hi-DPI означава комбиниране на системни настройки (и опции за съвместимост) с добри практики за разработка. С това, което обхванахме тук, можете да спрете да виждате размазани интерфейси, да настроите ултрашироките монитори в macOS с истински HiDPI резолюции, да активирате режим с висока плътност в Работни пространства И ако сте разработчик, мигрирайте приложението си към версия 2 за всеки монитор с ясен план: отговаряйте на WM_DPICHANGED, използвайте показатели „за DPI“ и разчитайте на смесен режим, когато е необходимо.

