Комбинација екрана високе густине и класичних десктоп апликација довела је до лавине питања: зашто је Експлорер замућен, како активирати Режим високе DPI на удаљеним клијентима, шта Додирните Подешавања у оперативном систему Windows (подесите DPI, скалирање и резолуцију у оперативном систему Windows 11), macOS или Linux, и шта програмери треба да ураде како би осигурали да се њихове апликације скалирају и остану прилагодљиве. Овај чланак обједињује све што вам је потребно да разумете и решите проблем, од најпрактичнијег до најтехничкијег.
Ако тражите како да се носите са замућеним прозорима, ситним менијима на 4K монитору или како да наметнете исправно скалирање на мониторима ултрашироки 2560×1080 (на пример, како ручно изаберите резолуцију), дошли сте на право место. Поред корисничких решења, сазнаћете шта Свест о ППП/ДПИ (по монитору, v1 и v2), савети за манифест и компатибилност и посебне смернице за ажурирање Win32, Windows Forms или WPF апликација.
Шта је Hi-DPI и зашто неке апликације изгледају замућено?
Модерни екрани концентришу много више пиксела по инчу (ppi/dpi) него пре неколико година (са традиционалних 96 DPI на 300 DPI и више). Када апликација не може да се прилагоди овом повећању, Windows на крају проширује свој интерфејс битмапама, што узрокује типичну ефекат замућења приликом скалирања; у оперативном систему Windows 11 постоје чак и функције попут Аутоматска супер резолуција које покушавају да побољшају изглед.
У Мајкрософтовој терминологији, апликација може бити несвесна, свесна система или свесна по монитору. Сваки профил дефинише да ли систем аутоматски се скалира или да ли треба поново да се нацрта са новим фактором скалирања. Што је већа осетљивост DPI, резултат ће бити оштрији при померању прозора између монитора са различитим скалирањем.
Случај File Explorer-а и замагљених системских апликација
Многи корисници се сусрећу са ситуацијом да се картица у C:\Windows\explorer.exe не појављује. КомпатибилностЕксплорер је посебно третирана системска компонента, тако да тамо нећете видети уобичајени панел „Поништавање понашања скалирања DPI“. Ако видите замућен Експлорер или Контролну таблу, проблем је обично у скалирање система (види како промените и подесите резолуцију екрана) на неприлагођеним деловима интерфејса.
Да би се генерално решио проблем замућених апликација, Windows 10/11 нуди опције попут „Дозволи Windows-у да покуша да поправи апликације како не би биле замућене“ и поништавање скалирања за појединачне апликације. Док Екплорер нема картицу компатибилности, ове системске функције могу побољшати целокупно понашање, док за друге апликације можете применити одређена замене скалирања из њихових својстава.
Режими препознавања DPI-ја у оперативном систему Windows
У Windows екосистему постоји јасна класификација начина на који апликација рукује скалирањем. Разумевање овога је кључно за дијагностиковање зашто прозор изгледа оштро на монитору, али нејасан у другом са другачијим фактором скалирања.
| Начин | од | Како ППП то види | Понашање при промени DPI-ја |
|---|---|---|---|
| Није свестан/свесна | Н / А | Увек 96 ППП (100%) | Скалирање битмапе (замућено) |
| Свестан система | windows КСП | Један DPI: онај примарног монитора приликом пријављивања | Изгледа оштро само на том DPI-ју; ако промените мониторе/скале, Windows увећај битмапу (замућено) |
| По монитору (v1) | прозори КСНУМКС | DPI монитора на коме се прозор првенствено налази | HWND највишег нивоа прима WM_DPICHANGEDнема аутоматског скалирања корисничког интерфејса |
| По монитору v2 | Прозори КСНУМКС КСНУМКС | DPI активног монитора по прозору | HWND-ови највишег нивоа и секундарни HWND-ови примају обавештење; Windows скалира неклијентску област, дијалози и теме из comctl32 V6 аутоматски |
У верзији 2 за сваки монитор, систем никада не ескалира захтеве апликације и она мора промена величине/прецртавање његов садржај након 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) се побољшава, али већ неко време подршка за Хигх ДПИ Било је делимично. Постоје два ефикасна начина: коришћење екстерног манифеста и превазилажење скалирања у компатибилности.
Спољни манифест: Креира кључ регистра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide са PreferExternalManifest=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_UsageDifference чији је заглавље hidpi.h, што доводи до забуне са „Hi-DPI“. Овај API нема никакве везе са скалирањем екрана: користи се за поређење Листе коришћења HID-а (дугмад/уноси) и добијање разлика између претходног и тренутног стања.
Његов потпис враћа HIDP_STATUS_SUCCESS и користи бафере PreviousUsageList и CurrentUsageList, смештајући нестајуће употребе у ЛистаКорисничкиПрекид и оне које се појављују у MakeUsageList. Нула у листи се тумачи као разграничник. За контекст, ово припада ХИД (тастатуре, гејмпадови), а не у свет Hi‑DPI екрана.
Брза дијагноза помоћу Process Explorer-а
Ако нисте сигурни како се апликација скалира, додајте колону „DPI Awareness“ у Process Explorer. Видећете статусе попут Непознато (систем увек скалирај), Системски свестан (узима почетни DPI и не реагује на промене) или по монитору. Ова провера је корисна за одлучивање да ли вам је потребан манифест, отказивање скалирања или рефакторисање распореда.
Савладавање Hi-DPI-ја значи комбиновање системских подешавања (и опција компатибилности) са добрим праксама развоја. Са оним што смо овде обрадили, можете престати да видите замућене интерфејсе, подесити ултрашироке мониторе у macOS-у са правим HiDPI резолуцијама, омогућити режим високе густине у ВоркСпацес и, ако сте програмер, мигрирајте своју апликацију на per-monitor v2 са јасним планом: одговорите на WM_DPICHANGED, користите метрике „за DPI“ и ослањајте се на мешовити режим када је то потребно.

