Ako otvorite File Explorer i sve izgleda mutno i ne možete pronaći karticu kompatibilnosti u izvršnoj sistemskoj datoteci, niste sami. Hi-DPI (DPI) skaliranje u Windowsu kombinuje moderne i starije komponente, a to dovodi do čudnih rezultata: zamagljenog teksta, nesrazmjernih kontrola i nedosljednog ponašanja između aplikacija.
Situacija se pogoršava kada promijenite monitore ili faktor skaliranja. UWP aplikacije obično ispadnu dobro, ali Win32 aplikacije zahtijevaju malo pažnje.Ovdje kombinujemo službenu Microsoftovu teoriju sa stvarnim slučajevima (Explorer, Office, SSMS, Chrome, Adobe) i kodom kako bismo vam pomogli da shvatite šta se dešava i kako da reagujete.
Zašto ne postoji kartica kompatibilnosti za explorer.exe?
Normalno je da se kartica kompatibilnosti ne pojavljuje u C:/Windows/explorer.exe. Explorer je dio Windows ljuske i zaštićen je, tako da se njegovim postavkama ne upravlja kao postavkama bilo koje druge aplikacije. Stoga, na primjer, ne možete prisilno promijeniti DPI iz njegovih svojstava.
Ako Explorer i Kontrolna ploča izgledaju mutno, uzrok nije jedan skriveni prekidač. Problem leži u načinu na koji Windows skalira stari interfejs kada dolazi do promjena DPI-ja ili se koristi monitor visoke gustoće. Kontroliranje ovoga zavisi od razumijevanja načina prepoznavanja DPI-ja i sistemskih opcija za ispravljanje zamućenih aplikacija.
PPP i faktor skaliranja: Osnove koje treba razumjeti
Kako se gustina piksela povećava, Moderni paneli su porasli sa 96 DPI na brojke blizu 300 DPI ili više.Da bi sve bilo čitljivo, Windows primjenjuje faktor skaliranja, a aplikacije moraju reagirati na njega.
Mnoge Win32 kodne baze su bile zasnovane na pretpostavci koja više ne važi: PPP je bio fiksan tokom cijelog procesa.Danas, s laptopima koji se povezuju i prebacuju između 1080p i 4K monitora, DPI se mijenja u hodu, ponekad i više puta u jednoj sesiji.
Tipični scenariji u kojima se mijenja DPI ili faktor skaliranja: premještanje prozora između monitora s različitim skalama, priključite/odvojite laptop, pokrenite udaljenu radnu površinu sa/na računare sa različitim DPI-jem ili dodirnite kontrolu skaliranja u Postavkama dok su aplikacije otvorene.
Režimi prepoznavanja DPI-ja u Windowsu
Desktop aplikacije moraju obavijestiti Windows da li znaju kako da se nose sa skaliranjem. Ako to ne učine, sistem pretpostavlja 96 DPI i rasteže bitmapu., što izgleda mutno. Ovo su ključni načini rada:
Nesvjesni PPPAplikacija se renderira u rezoluciji od 96 DPI (100%). Na većim ekranima, Windows zumira bitmapu na očekivanu fizičku veličinu, a interfejs postaje mutan.
Svjestan sistema- Aplikacija uzima DPI primarnog monitora prilikom prijave i prilagođava veličinu svog korisničkog interfejsa u skladu s tim. Ako ga premjestite na drugi monitor s drugačijom DPI rezolucijom, Windows ga rasteže i postaje mutan.Izgleda oštro samo pri DPI-ju za koji je inicijaliziran.
Svjesno monitora (po monitoru, V1)Uvedeno u Windowsu 8.1. Prozori najvišeg nivoa primaju obavještenje o promjeni DPI-jaWindows ne skalira bitmapu, a aplikacija vidi fizičke piksele na svakom ekranu. Funkcionalno je, ali ograničeno.
Po monitoru v2Preporučuje se od verzije Windows 10 1703. Pruža ključna poboljšanja: obavještenja za HWND-ove najvišeg nivoa i sekundarne HWND-ove, Windows automatski skalira područje koje nije klijentsko (naslov, trake za pomicanje), Dijalozi CreateDialog i resursi crtani po temi (comctl32 V6) na odgovarajući DPI. Aplikacija vidi sirove piksele i Windows ih nikada ne skalira.
UWP vs Win32: Zašto neke stvari izgledaju dobro, a druge ne

Ako kreirate aplikaciju od nule i odlučite se za UWP, okvir Automatski ponovo iscrtava na osnovu DPI-ja monitoraNema se šta drugo učiniti. Međutim, prethodne tehnologije (čisti Win32, Windows Forms, WPF, GDI, MFC, itd.) se ne skaliraju same od sebe; moraš to programirati ili će izgledati mutno, premalo ili nesrazmjerno.
Ovo je primjetno u svakodnevnim detaljima klasičnog korisničkog interfejsa: prilikom podešavanja sistema na 200% Traka za pomicanje može postati deblja, a neka dugmad se mogu smanjiti, sa krivuljama i ivicama koje izgledaju čudno. Ova vrsta nedostatka utiče na Explorer i druge dijelove Win32 ljuske, ne UWP-u.
Koji se frameworki najbolje skaliraju (a koji ne)
Prema Microsoftu, podrška za monitore varira ovisno o tehnologiji. UWP ima punu podršku i sam okvir se bavi skaliranjem. Win32 sa Common Controls V6 (comctl32.dll) u 1703 uključuje obavještenja svim HWND-ovima, Resursi s temama koje se preraspodjeljuju prema ispravnom PPP-u i dijalozima koji se sami skaliraju.
Windows Forms ima ograničeno automatsko skaliranje monitora za određene kontrole, dok se nativni WPF dobro skalira ako ostanete u WPF-u, koegzistencija s drugim hostovanim okvirima se ne skalira automatski. GDI, GDI+ i MFC ne pružaju podršku sami po sebi: logika mora biti implementirana od strane aplikacije.
Nadogradite svoju desktop aplikaciju na Per-Monitor (V2)
Minimalni cilj je da, Sa svakom promjenom DPI-ja, važni dijelovi korisničkog interfejsa se mijenjaju u veličiniAko vaša aplikacija trenutno koristi sistemske karakteristike, Windows će je rastegnuti i učiniti da izgleda mutno kada je skalirate. Da biste to izbjegli, konvertujte je u Per-Monitor V2 i ponovo je crtajte u hodu.
Praktične smjernice za migraciju: ključni koraci za izbjegavanje istezanja
- Deklariše V2 po monitoru u manifestu ili koristite odgovarajući API, ovisno o vašem okviru.
- Izdvojite logiku rasporeda iz boot-a i pretvorite ih u rutine za višekratnu upotrebu koje također pozivate na WM_DPICHANGED.
- Ponovo procijenite podatke osjetljive na PPP (fontovi, veličine, metrike) pri svakoj promjeni DPI-ja; nemojte ih keširati.
- Ponovno učitavanje ili remasteriranje bitmapa novoj skali ili, ako to nije izvodljivo, prihvata skaliranje bitmape za te resurse.
- Zamjenjuje nesvjesne API-je po DPI varijantama: na primjer, GetSystemMetrics → GetSystemMetricsForDpi.
- Testiranje u okruženjima s više nivoa PPP-a (više monitora, RDP, vruće skaliranje).
- Za Windowse koje još ne možete ažurirati, koristi miješano skaliranje sa prepoznavanjem niti.
Pojednostavljeni primjer Win32Naivni slučaj (pretpostavlja se 96 DPI) koji kreira dugme i izgleda loše pri visokoj DPI rezoluciji:
case WM_CREATE: { // Add a button
HWND hWndChild = CreateWindow(L"BUTTON", L"Click Me", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
50, 50, 100, 50, hWnd, (HMENU)NULL, NULL, NULL);
}
Adaptirana verzija: skalira poziciju i veličinu pomoću GetDpiForWindow i odgovara na WM_DPICHANGED:
#define INITIALX_96DPI 50
#define INITIALY_96DPI 50
#define INITIALWIDTH_96DPI 100
#define INITIALHEIGHT_96DPI 50
void UpdateButtonLayoutForDpi(HWND hWnd) {
int iDpi = GetDpiForWindow(hWnd);
int dpiScaledX = MulDiv(INITIALX_96DPI, iDpi, USER_DEFAULT_SCREEN_DPI);
int dpiScaledY = MulDiv(INITIALY_96DPI, iDpi, USER_DEFAULT_SCREEN_DPI);
int dpiScaledWidth = MulDiv(INITIALWIDTH_96DPI, iDpi, USER_DEFAULT_SCREEN_DPI);
int dpiScaledHeight = MulDiv(INITIALHEIGHT_96DPI, iDpi, USER_DEFAULT_SCREEN_DPI);
SetWindowPos(hWnd, hWnd, dpiScaledX, dpiScaledY, dpiScaledWidth, dpiScaledHeight,
SWP_NOZORDER | SWP_NOACTIVATE);
}
...
case WM_CREATE: {
HWND hWndChild = CreateWindow(L"BUTTON", L"Click Me", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
0, 0, 0, 0, hWnd, (HMENU)NULL, NULL, NULL);
if (hWndChild != NULL) { UpdateButtonLayoutForDpi(hWndChild); }
} break;
case WM_DPICHANGED: {
HWND hWndButton = FindWindowEx(hWnd, NULL, NULL, NULL);
if (hWndButton != NULL) { UpdateButtonLayoutForDpi(hWndButton); }
} break;
Mješovito skaliranje i svijest o nitima
Ažuriranje cijelog velikog korisničkog interfejsa odjednom može biti nerealno. Tu se miješani način rada (DPI po niti)Možete ostaviti neke prozore na gornjem nivou u njihovom prvobitnom stanju, dok ostale modernizujete.
Počevši od Windows 10 1607, prepoznavanje DPI-ja može se postaviti za svaki prozor najvišeg nivoaPodređeni prozori moraju naslijediti način rada roditelja. Koristite SetThreadDpiAwarenessContext prije kreiranja prozora s kojim će se povezati u željeni način rada i nakon toga ga vratite.
C++ obrazac Da biste zaključali DPI kontekst niti tokom kreiranja:
class DpiAwarenessContextBlock {
public:
DpiAwarenessContextBlock(DPI_AWARENESS_CONTEXT dpiContext) noexcept {
m_contextReversalType = SetThreadDpiAwarenessContext(dpiContext);
}
~DpiAwarenessContextBlock() {
SetThreadDpiAwarenessContext(m_contextReversalType);
}
private:
DPI_AWARENESS_CONTEXT m_contextReversalType;
};
Ekvivalentni upravljani (C#) obrazac za prebacivanje i vraćanje konteksta u blokovima: korisno u rješenjima s više prozora.
class DPIContextBlock : IDisposable {
private DPI_AWARENESS_CONTEXT resetContext;
public DPIContextBlock(DPI_AWARENESS_CONTEXT contextSwitchTo) {
resetContext = SetThreadDpiAwarenessContext(contextSwitchTo);
}
public void Dispose() { SetThreadDpiAwarenessContext(resetContext); }
}
Testovi koje ne biste trebali preskakati i tipične greške
Da biste provjerili da li vaša aplikacija dobro reaguje, premjestite je između ekrana različitih skala, pokrenite ga direktno u jednom ili drugom, promijenite faktor skaliranja dok je aplikacija pokrenuta i promijenite početni ekran, odjavite se i pokušajte ponovo.
Uobičajene greške:
- Ignoriraj predloženi pravougaonik u WM_DPICHANGEDKoristite ovo za promjenu veličine i izbjegavanje DPI petlji i skokova kursora.
- Loše dokumentirana virtualizacijaAko pozivate API-je iz nesvjesne niti, Windows može virtualizirati vrijednosti. Promijenite kontekst pomoću SetThreadDpiAwarenessContext i ne zaboravite ga vratiti.
- PPP API-ji bez kontekstaZa ikone, veličine, metrike… koristite varijante poput LoadImage umjesto LoadIcon ili GetSystemMetricsForDpi umjesto GetSystemMetrics.
- Prisilno resetiranje prepoznavanja procesaRoditeljski i podređeni objekti s različitim DPI načinima rada ne mogu postojati u istom HWND stablu. Operacije poput CreateWindow/SetParent s nekompatibilnim načinima rada mogu uzrokovati resetiranje ili neuspjeh.
Office: Šta radi i kako se besprijekorno integrirati
Office 2016 i novije verzije ažuriraju se kada se skala promijeni, ali rješenja za skalabilnost moraju biti poravnata da bi se ispravno crtalo. Ako vas DPI postavka utiče, vidjet ćete loše pozicionirane prozore, vanjske kontrole i fontovi ili slike sa netačnim veličinama.
Relevantni načini rada u Officeu:
- Nesvjestan: uvijek 96 DPI; sve je rastegnuto.
- Svjestan sistemaDPI primarnog monitora se uzima pri pokretanju; pri sljedećim promjenama, Windows se rasteže.
- Po monitoru: najviši nivo prima obavještenja i ponovo se crta. U v2, kćerke ih također primaju, ali Office ne koristi PMv2.
Kontekst teme: Glavna Office nit ide po monitoru. Ako kreirate dodatne niti, Office ih prisiljava da rade po monitoru.Ako očekujete drugačiji kontekst, promijenite ga pomoću SetThreadDpiAwarenessContext. U povratnim funkcijama sustava Office, Kontekst se pojavljuje kada je sistem svjestanPrilagodite ga svom prozoru.
Prozori najvišeg nivoa u odnosu na podređene prozore: Vaši prozori najvišeg nivoa mogu ići u bilo koji režim koji odaberete i primati obavijestiSekundarne datoteke moraju poštovati prepoznavanje glavne datoteke. U sistemu Windows 1709, kćerinske datoteke su bile dostupne po monitoru; od verzije 1803, Office može koristite mješoviti način rada radi poboljšanja kompatibilnosti (iako može izgledati mutno zbog rastezanja).
Korisne postavke za korisnike: U Officeu uključite način kompatibilnosti ekrana Prisilno prilagođavanje sistemu (sve rastegnuto, moguće zamućenje, ali konzistentno). U Windowsu 10 1803+, sistemska opcija za Ispravljanje mutnih aplikacija Također pomaže ako vaše rješenje nije dobro predstavljeno.
Vrste proširivosti i nijanse:
- VSTOPodređeni prozori moraju odgovarati roditeljskoj svijesti (koristite GetWindowDpiAwarenessContext). Prozori najvišeg nivoa mogu se postaviti na bilo koji željeni način rada. Možete implementirati obrazac koji reagira na WM_DPICHANGED i kontrole skaliranja i izvori u OnDpiChangedEventu.
- COM dodaciZa prozore najvišeg nivoa, kreirajte DPI kontekstni blok prije kreiranja prozora i obradite WM_DPICHANGED.
- ActiveX s prozoromreagovati na WM_SIZE; Možete provjeriti GetDpiForWindow i ponovo izračunati pozicije i izvore.
- ActiveX bez prozoraU dizajnerskom modu, kontejner može vratiti 0 u hDC-u i ne postoji pouzdan PPP; u vremenu izvođenja, Koristite HWND koji vam Office vraća konsultovati PPP i razmjeru.
- OLEPostoje ograničenja u mješovitim scenarijima; novije verzije sistema Office omogućavaju lokalnu aktivaciju s uslovima zasnovanim na DPI kontekstu i opciji izgleda/kompatibilnosti koju je odabrao korisnik.
- Web dodaci: pokrenuti u kontroli preglednika; primjenjuju iste responzivne tehnike kao i web.
SSMS na 4K ekranima: eksterni manifest i alternative

Na UHD računarima, uobičajeno je da SQL Server Management Studio izgleda mutno u starijim verzijama. Klasičan način je bio omogući vanjske manifeste s ključem registra PreferExternalManifest i postavite datoteku ssms.exe.manifest u instalacijsku mapu kako biste prisilili prepoznavanje PPP-a.
Prečica za taj pristup: kreirajte ključ u HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide s nazivom PreferExternalManifest (DWORD=1), sačuvajte manifest u putanji ssms.exe sa UTF-8 kodiranje i ponovo pokrenite. Hi-DPI beta podrška je uvedena u SSMS 16.3, a ikone su poboljšane u SSMS 17, ali rezultati su varirali ovisno o verziji i konfiguraciji.
Još jedan koristan alat je Process Explorer (Sysinternals) da biste dodali kolonu "DPI Aware" i provjerili da li je proces "Unawenge", "System-aware" ili "Per-Monitor". Na ovaj način možete provjeriti da li Vaša prilagodba je stupila na snagu.
Brza alternativa bez manifesta: u Izvršna svojstvaNa kartici Kompatibilnost označite opciju „Nadiđi ponašanje skaliranja pri visokoj DPI“ i postavite „Skaliranje izvodi“ na „Aplikacija“. Ovo prisiljava režim po monitoru i sprječava rastezanje Windowsa kada se promijeni DPI. U mnogim slučajevima, ispravlja zamućenje SSMS-a bez dodirivanja registra.
Reference kolone u Process Exploreru: Nesvjestan (sve na 96 DPI, rastegnuto sistemom), Svjestan sistema (koristi početni DPI, a zatim se rasteže pri promjenama) i Po monitoru (precrtano pri promjeni). Svaki objašnjava zašto aplikacija izgleda oštro ili mutno ovisno o scenariju.
Chrome i Adobe u Hi-DPI: Šta možete očekivati
Chromeovo prikazivanje fontova na Windowsu je problem već godinama. Ispravke su uvedene u verzijama za razvojne programere (kao Canary sa DirectWrite-om u svoje vrijeme) koji je znatno poboljšao oštrinu na Hi-DPI ekranima, iako po cijenu mogućih povremenih kvarova ili veće potrošnje CPU-a u ranijim verzijama.
U prethodnoj generaciji Adobe paketa, Photoshop bi mogao prikazati sićušni interfejsAdobe je dodao opciju 200% korisničkog interfejsa koja djelimično rješava problem u novijim verzijama; sa starijim verzijama, morali biste živjeti sa malim menijima ili koristiti prečice.
U InDesignu i Illustratoru se dogodilo suprotno: ispravne veličine, ali mutnoRješenje je bilo onemogućavanje automatskog skaliranja u Kompatibilnosti (svojstva prečice) s opcijom "Onemogući skaliranje prikaza pri korištenju visokih DPI postavki", što je rezultiralo manjim, ali oštrijim korisničkim interfejsom.
Još jedna neobičnost u Photoshopu: zastarjeli ili utrostručeni alatiPrilagođavanje veličine elemenata na prilagođenu vrijednost (npr. 149% ili 151% umjesto 150%) pod opcijom "Povećaj ili smanji tekst i ostale elemente" može vratiti vašu web stranicu na pravi put.
Ako tražite alternative, GIMP nudi besplatnu i moćnu opciju koji dobro funkcioniše u okruženjima visoke gustine uz pravu konfiguraciju.
Nazad na Explorer: Šta možete uraditi iz sistema
Iako ne možete dirati kompatibilnost u explorer.exe, Windows 10 i noviji dolaze s dvije sigurnosne linije za cjelokupni doživljaj:
- Postavke > Sistem > PrikazPostavite preporučeni faktor skaliranja i izbjegavajte neuobičajene vrijednosti osim ako ne zadovoljavaju specifične potrebe. Za računare s čestim promjenama monitora, najbolje je odjavi se i ponovo se prijavi nakon većih promjena.
- Postavke > Sistem > Prikaz > Napredne postavke skaliranjaUključite opciju „Dozvoli Windowsu da pokuša popraviti aplikacije kako ne bi bile mutne“. Ovo pomaže sa starijim aplikacijama kada mijenjate ekrane ili skale.
Osim toga, za svaku aplikaciju (osim Explorera) možete otvoriti njena svojstva i koristiti "Nadiđi ponašanje skaliranja HIGH DPI" da biste odabrali "Aplikacija", "Sistem" ili "Sistem (Poboljšano)" po potrebi. To je efikasan resurs kada određena aplikacija pruža otpor i ne možete promijeniti njegov kod.
Imajući sve navedeno u vidu, šira slika je jasna: UWP-ovi se sami prilagođavaju, Win32-ovi se također dobro prilagođavaju, a ostali trebaju podešavanje.Explorer i drugi dijelovi ljuske vuku za sobom historijske odluke, ali ekosistem nudi prečice i API-je za njihovo zaobilaženje.