Hvis du kæmper med slørede vinduer, små menuer på 4K-skærme, eller at Explorer ikke lader dig røre sin opskaleringstilstand, så er her den guide, du har brug for. Vi har samlet alt om, hvordan og hvorfor... Høj DPI-tilstand Hvilke reelle muligheder har du som bruger i Windows, og hvilke udviklere skal implementere for at få brugerflader til at se skarpe ud på enhver skærm.
Landskabet blander stadig tættere skærme med applikationer, der blev født, da 96 DPI var normen. Når en app ikke tilpasser sig den øgede tæthed, forstørrer Windows den som et foto, hvilket forårsager den typiske sløringseffektWindows 11 inkluderer endda en automatisk Super Resolution-funktion til at forbedre skarpheden, men nøglen er stadig DPI-bevidstheden i hver app og de korrekte systemindstillinger, især hvis du kombinerer skærme med forskellige skalaer eller bruger eksterne klienter.
Hvad er Hi-DPI, og hvorfor ser nogle vinduer dårlige ud?
Tætheden af moderne paneler er steget voldsomt: fra de klassiske 96 DPI til værdier tæt på eller større end 300. Når appen ikke er opmærksom på DPI'en, ender systemet med at skalering med bitmap, og dette forringer tekst og ikoner. Med skaleringsfaktorer på 125 %, 150 % eller højere er forskellen mellem en responsiv app og en, der ikke er det, enorm.
I Microsofts terminologi kan en app være ubevidst, systembevidst eller skærmbevidst. Hver tilstand definerer, om Windows skalerer appen automatisk, eller om den skal ... tegn din brugergrænseflade om til selve den nye skala. Jo højere bevidsthedsniveauet er, desto skarpere bliver resultatet, når du flytter vinduet mellem skærme med forskellige skalaer.
Stifinder: Hvorfor fanen Kompatibilitet mangler
Mange brugere oplever, at der i C:\Windows\explorer.exe ikke er nogen faneblad for kompatibilitet; dette er ikke en fejl, det er bare, at Explorer modtager særlig systembehandlingDerfor vil du ikke se det typiske panel "Overstyr høj DPI-skaleringsadfærd" der. Hvis du ser slørede billeder i Stifinder eller Kontrolpanel, er årsagen normalt global systemskalering, der anvendes på dele, der ikke er fuldt tilpasset.
Selvom du ikke kan ændre kompatibiliteten i explorer.exe, tilbyder Windows 10 og 11 løsninger: muligheden "Lad Windows forsøge at rette apps, så de ikke er slørede" og tilsidesættelse af skalering pr. app fra genveje eller eksekverbare filer fra tredjepart. Disse funktioner kan forbedre den samlede funktionalitet; for yderligere trin, se Løsning på sløret skærm i Windows 10Disse funktioner kan forbedre den generelle adfærd, og for de fleste programmer vil du kunne anvende skaleringsannullering fra deres ejendomme.
DPI-bevidsthedstilstande i Windows

At forstå DPI-tilstande er grundlag for diagnose Hvorfor noget ser skarpt ud på én skærm og sløret på en anden. Nedenfor er en generel oversigt over, hvordan hver enkelt opfører sig, når den skaleres, og mellem skærme med forskellige DPI'er.
| Modo | fra | Hvordan PPP opfatter | Adfærd ved ændring af DPI |
|---|---|---|---|
| Ikke bevidst | N / D | Altid 96 PPP | Bitmap-skalering (sløret) |
| Systembevidst | Windows Vista | En enkelt DPI: den på hovedskærmen, når du logger ind | Kun skarp ved den DPI; hvis du skifter skærm eller skalerer, vil systemet forstør bitmap |
| Pr. skærm (v1) | Windows 8.1 | DPI på skærmen, hvor vinduet er placeret | Vinduet på øverste niveau modtager WM_DPICHANGEDder er ingen automatisk skalering af din brugergrænseflade |
| Pr. skærm v2 | Windows 10 1703 | DPI for den aktive skærm pr. vindue | Topniveau og sekundære niveauer modtager besked; Windows skalerer ikke-klientområde, dialoger og temaer fra comctl32 V6 |
I per-monitor v2 skaleres applikationen aldrig af systemet; den skal skalér og tegn om dens indhold efter WM_DPICHANGED. Til gengæld justerer systemet ikke-klientområdet (titel, rammer og bjælker) for dig og skalerer automatisk dialogbokse oprettet med CreateDialog og almindelige kontrolelementer med temaer.
Windows-indstillinger til at reducere sløring
Hvis du ikke er udvikler eller leder efter hurtige genveje, indeholder Windows 10/11 justeringer, der kan gøre en forskel. Indstillingen "Lad Windows forsøge at rette apps, så de ikke er slørede" gennemtvinger rettelser ved at omskalere problematiske apps, når den registrerer skærmændringer, hvilket hjælper med at undgå slørede grænseflader når vinduet flyttes mellem skærme.
Derudover kan du åbne egenskaberne for en genvej eller .exe, gå til Kompatibilitet og aktivere "Overstyr skaleringsadfærd ved høj DPI" ved at vælge "Program". Denne overstyring fortæller systemet, at det ikke skalerer vinduet for dig, og lader programmet reagere på DPI-ændringen; i apps, der allerede fungerer godt, forbedres skarpheden betydeligt. radikalI explorer.exe er denne fane, som sagt, ikke tilgængelig.
Specifikke tips til ultrabrede skærme og fjernklienter
Hvis du bruger ultrabrede skærme, f.eks. 2560x1080, er det nogle gange en god idé at manipulere manuelle opløsninger og skalering, indtil du finder en afbalanceret kombination. I mange tilfælde reducerer det at indstille en ensartet systemskala og undgå ikke-Hi-DPI-opløsninger, der produceres af panelet, små menuer og eliminerer skalering af artefakter, og hvis du arbejder med sekundære skærme, lær at konfigurer en tablet som en anden skærmPå macOS er der ægte HiDPI-tilstande, som du kan aktivere for at opnå skarphed på mellemniveau.
I fjernskrivebordsscenarier og tjenester som f.eks. arbejdsområder er DPI-forskelle mellem klienten og værten almindelige. Sørg for, at fjernsessionen korrekt forhandler skalering eller starter forbindelsen med parametre, der afspejler den faktiske DPI. Hvis din app er Per-Monitor v2, vil den reagere bedre på disse ændringer. Hvis ikke, vil du ofte se forstørrede vinduer med et bitmap.
Opdater en desktopapplikation for at skalere godt
Det absolut nødvendige minimum er at markere processen som en v2 pr. skærm via manifest eller API og flytte layoutlogikken ud af initialisering for at blive genudført, når DPI'en ændres. Stop med at cache skriftstørrelser, margener og metrikker for altid; du skal genberegne hver gang WM_DPICHANGED modtages.
Mange historiske Win32 API'er har ingen DPI-kontekst og returværdier i forhold til systemets DPI. Erstat klassiske kald med deres moderne versioner: brug HentSystemMetricsForDpi I stedet for GetSystemMetrics anvender den EnableNonClientDpiScaling under WM_NCCREATE for at få systemet til at skalere rammen og udnytter GetDpiForWindow til at beregne koordinater og størrelser baseret på vinduets faktiske DPI.
Trådet DPI-genkendelse: Blandet tilstand
For store projekter eller projekter med tredjepartsbrugergrænseflader kan du migrere i faser. SætTrådDpiBevidsthedsKontekst Du tildeler DPI-bevidsthed til vinduer, der oprettes, mens konteksten er aktiv, så du opdaterer hovedvinduet til pr. skærm og lader andre vinduer på øverste niveau være i deres gamle tilstand. Dette er en nyttig måde at fokusere på den mest synlige del først uden at røre ved alt på én gang.
Selvfølgelig følger der strenge regler med blanding af tilstande: et vinduestræ kan ikke blande forskellige forældre- og underordnede tilstande. Hvis du bryder reglen, kan Windows tvinge en nulstil DPI-tilstand fra processen eller returnere fejl som ERROR_INVALID_STATE, når forældreskab ændres med SetParent. I krydsprocesser kan tvungne nulstillinger også forekomme, når HWND'er oprettes eller genforældes med inkompatible kontekster.
Vigtige tests til at detektere skaleringsfejl
Inkluder i din plan flytning af vinduer mellem skærme med forskellige skalaer, start appen på hver skærm, skift skala undervejs, og log ud og ind igen efter ændring af den primære skærm. Sådan opstår de. DPI-søgninger, gemte størrelser med forkerte antagelser og problemer med vinduesplacering.
Typiske fejl: ignorering af det foreslåede rektangel i WM_DPICHANGED (det ødelægger markørens positionering og kan kæde DPI-hændelser sammen), forespørgsler om metrikker fra en tråd med den forkerte DPI-kontekst og brug af API'er uden DPI-kontekst til at indlæse ressourcer. For ikoner, for eksempel, erstat LoadIcon med Indlæs billede med den passende størrelse for hver DPI.
Koordinér virtualisering og DPI-kontekst
Når en proces eller tråd kører som uvidende eller systembevidst, kan Windows virtualisere DPI-følsomme værdier for at simulere 96 DPI. Dette komplicerer diagnosen, fordi du vil se skærmstørrelser, positioner eller metrikker "justeret" til konteksten. Kontroller altid, at den aktive tråd er i DPI-kontekst at du venter, før du forespørger eller opretter vinduer, og gendanner den forrige kontekst efter brug af SetThreadDpiAwarenessContext for at undgå spredning af fejl.
Det er vigtigt at antage, at mange ældre API'er ikke kan overføre HWND eller DPI i deres signatur. Derfor er det vigtigt at migrere til moderne varianter eller kompensere manuelt: GetSystemMetricsForDpi, EnableNonClientDpiScaling, GetDpiForWindow og lignende funktioner er fundamentet for at forhindre, at din brugergrænseflade skaleres af bitmap og kan tegnes tydeligt i enhver skala.
Kompatibilitet mellem frameworks og teknologier
Med Windows 10 1703 og fremefter er understøttelsen af framework forbedret, men den er ikke ensartet. UWP skalerer automatisk pr. skærm, mens arbejdet i Win32 ligger hos udvikleren. Windows Forms og WPF har set forbedringer, og comctl32 v6 skalerer temabaserede ressourcer, dialoger og underretter alle HWND'er om DPI-ændringer; GDI og GDI+ tilbyder ikke native understøttelse, og MFC er afhængig af app-kode.
| Ramme eller teknologi | Støtteniveau | SO | Hvem klatrer |
|---|---|---|---|
| UWP | completo | 1607 + | Framework |
| Win32 + comctl32 V6 | PMv2: Giv alle HWND'er besked; eskalerede dialoger og emner | 1703 + | ansøgning og ikke-klientsystem |
| Windows-formularer | Begrænset skærmskalering | 1703 + | Framework |
| WPF | Native i WPF-apps; blandet hosting kræver justeringer | 1607 + | Framework |
| GDI / GDI+ | Ingen | N / D | ansøgning |
| MFC | Ingen | N / D | ansøgning |
Direct2D og enhedsuafhængige pixels
Direct2D gør livet meget lettere i Hi-DPI: det udtrykker koordinater i DIP (enhedsuafhængige pixels), tillader bitmaps med deres egen DPI, respekterer systemets DPI, hvis manifestet erklærer understøttelse, og bruger et koordinatrum på flydende komma som skalerer til enhver vilkårlig DPI. Pipelinen er designet til at skalere fra 96 til meget høje værdier uden at miste kvalitet.
I Windows 8 og nyere justerer Direct2D tekstens anti-aliasing-tærskler ved høj DPI, hvilket fremskynder gengivelsen. Om nødvendigt kan du skifte enhedstilstand til pixels ved hjælp af ID2D1DeviceContext::SetUnitMode og fortsætte med at drage fordel af disse optimeringer. En DIP svarer til én fysisk pixel ved 96 DPI; ved 192 DPI ville hver DIP optage to pixels. Denne abstraktion eliminerer rigide antagelser i layoutet og gør brugergrænsefladen mere forudsigelig.
Hurtig diagnose med Process Explorer
For at forstå, hvordan en specifik app skalerer, giver Process Explorer (Sysinternals) dig mulighed for at tilføje en kolonne med "DPI-bevidsthed". Du vil se tilstande som "Ukendt" (systemet skalér altid), Systembevidst (kun skarp ved initial DPI) eller Pr. skærm. Denne kontrol hjælper dig med at beslutte, om du har brug for et manifest, en skaleringsoverstyring eller en distributionsrefaktorering.
Praktisk studie: SSMS på 4K-skærme
SQL Server Management Studio er blevet forbedret gennem årene, men i lang tid var Hi-DPI-understøttelsen delvis. Der er to nyttige måder: at bruge et eksternt manifest og at anvende skaleringsoverstyring fra kompatibilitet. Begge kan opnå store fordele. skarphed uden at vente på ændringer i selve appen.
Eksternt manifestOpret registreringsdatabasenøglen HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide med DWORD-værdien PreferExternalManifest lig med 1. Gem derefter en UTF-8 ssms.exe.manifest-fil, der deklarerer DPI-bevidsthed sammen med ssms.exe. Ved genstart vil ikoner og tekst se meget renere ud i UHD 3840×2160, og Process Explorer vil vise, at processen enten er systembevidst eller pr. skærm afhængigt af det anvendte manifest.
Skaleringsoverstyring: I SSMS-genvejen skal du åbne Kompatibilitet og markere "Overstyr skaleringsadfærd ved høj DPI" ved at vælge "Program". Dette tvinger SSMS til at opføre sig som en app, der styrer sin egen skalering og forhindrer Windows i at skalere den med bitmap, når DPI'en ændres; på mange computere er dette enkleste løsning for at afslutte sløringen.
Hvis du sletter det eksterne manifest, viser Process Explorer "Ukendt", hvilket indikerer, at appen ikke skalerer til DPI-ændringer, og systemet vil skalere den igen. I ældre versioner som SSMS 2012/2014 fandtes der ikke beta-understøttelse, så intervention med manifester fungerede ikke på samme måde, og outputtet lignede ofte apps'. ikke bevidst.
UWP vs. klassiske desktop-frameworks
Hvis du starter fra bunden, og dit scenarie passer, er det nemmest at oprette en UWP-app: den skalerer automatisk og dynamisk på hver skærm. I modsætning hertil kræver rene Win32-, Windows Forms- eller WPF-apps, der hoster andre frameworks, yderligere arbejde fra udvikleren for at reagere på DPI-ændringer. Uden denne indsats vil beskåret tekst, slørede ikoner og forkert størrelse når man skifter mellem skærme.
God implementeringspraksis
Sådan migrerer du en systembevidst app til en skærm: Marker processen som PMv2 i manifestet, gør layoutet genanvendeligt, og kør det også efter WM_DPICHANGED, tilsidesæt DPI-antagelser, genindlæs bitmap-ressourcer til den nye størrelse, og erstat kontekstløse DPI-kald med deres egne. ækvivalenter for DPITest appen på enheder med flere skærme og vægte.
Glem ikke at bruge det foreslåede rektangel, der følger med WM_DPICHANGED, til at ændre størrelsen; dette undgår rekursioner og holder markøren i samme relative position. Hvis du har brug for en alternativ størrelse, skal du svare med WM_GETDPISCALEDSIZE. Og når du midlertidigt ændrer trådens DPI-kontekst, skal du huske at gendanne den efter afslutning for at undgå spredning. bivirkninger.
Hvad er der galt med hidpi.h? Det er ikke Hi-DPI.
Der er en header kaldet hidpi.h relateret til HID (Human Interface Device), som intet har at gøre med skærmtæthed. Rutinen HidP_UsageListDifference Det bruges til at sammenligne lister over enhedsbrug og returnerer statusser såsom HIDP_STATUS_SUCCESS, hvor de forsvindende brugsområder placeres i BreakUsageList og de viste brugsområder i MakeUsageList. Det er nyttigt til tastaturer og controllere, men påvirker ikke UI-skalering heller ikke til PPP.
Og på macOS eller Linux?
Uden for Windows tilbyder macOS ægte HiDPI-tilstande og lader dig vælge skalerede opløsninger, der bevarer skarpheden; dette er nyttigt med Retina-bærbare computere eller 4K-skærme. På Linux har Wayland forbedret skalering pr. skærm sammenlignet med Xorg, selvom oplevelsen varierer mellem stationære computere. Hvis du arbejder i blandede miljøer, skal du kontrollere, at hvert system understøtter dette. HiDPI-opløsninger autentisk og undgår skærmskalering af lav kvalitet.
Hemmeligheden bag at undgå rodede grænseflader er at kombinere systemjusteringer med god udviklingspraksis: forståelse af DPI-tilstande, kun at tvinge skaleringsoverstyring, når det er passende, at anvende Per-Monitor v2, at bruge API'er "til DPI", at teste grundigt i scenarier med flere skærme og, når det er nødvendigt, at bruge manifester eller værktøjer som Process Explorer til at revidere adfærd.
Med disse elementer på plads kan du finjustere Explorer og resten af dine apps, så de ser klar og sammenhængende på enhver skærm. Del disse oplysninger, så andre brugere kender til Hi-DPI-tilstand i Windows.
