Important Update — Windows 10 “Creators Update” (version 1703, released in April 2017) brought a greatly simplified interface for high DPI settings and additional per-application compatibility options. Both are described in a new post, DPI Settings in Windows 10 “Creators Update”, which obsoletes the post below for “Creators Update” and newer.
Windows 10 has once again modified the user interface for high DPI settings. Currently these changes are completely undocumented, as far as I can tell. Microsoft no longer ships any decent user documentation with Windows, the developer documentation so far only covers Windows versions through 8.1, and a promised article on the official Windows blogs never materialized. So the following overview is based on my own experimentation.
2016-04-01: Turns out a Microsoft article did appear in December 2015, but on the Windows Server Core Team blog of all places! That article only briefly mentions the new user interface but otherwise provides a good backgrounder for the evolution of Windows DPI scaling.
2016-08-20: Another article covers new functionality in Windows 10 Anniversary Update. The changes all concern new developer APIs for dynamically changing DPI settings, such when a laptop is docked or undocked. They don’t seem to affect existing applications.
Blurry Text After Upgrading — Windows 10 enforces DPI virtualization (i.e. blurry bitmap scaling) at all scaling levels, even at 125% (120 DPI) which had defaulted to XP style scaling in older versions. See my main article, High DPI Settings in Windows, for what this all means. The important point is this: if you’re running at 120 DPI and text that used to look sharp suddenly looks blurry in Windows 10, you need to manually disable DPI virtualization for each individual blurry-looking application. (2015-11-02)
Windows 8.1 had introduced different DPI scaling levels for each attached monitor, but did not allow users to set these levels manually. Rather, you set one overall desired size and Windows 8.1 would attempt to guess the matching per-monitor scaling. Windows 10 adds the missing feature.
When you first boot up or manually enter a scaling level for one monitor, Windows still attempts to automatically scale any additional monitors proportionally to make screen elements approximately the same physical size. However, you can override this default by selecting each monitor and changing the scaling level manually. You can find the required controls in the “modern” Settings app, under System: Display. The available DPI scaling levels have been expanded to 100–350% on my system, starting with 25% increments.
Windows 10 continues to offer the old Control Panel alongside the new Settings app, and you can access the traditional system-wide DPI scaling options there – although you’d never guess from Microsoft’s non-documentation. The options are in the usual place (Appearance and Personalization: Display) but the contents have changed quite massively. You get a paragraph of text lecturing you why you shouldn’t be here, a link back to the Settings app, and finally a link to Set a custom scaling level that brings up the familiar old Custom sizing options dialog, complete with ruler and Segoe UI sample text.
The Custom sizing options dialog not only expands the scaling range further to 100–500% and lets you enter arbitrary percentage values with the keyboard, it also sets the same scaling level for all attached displays. Internally, if you confirm this dialog and choose Apply on the Control Panel page, Windows 10 will change the registry key
HKEY_CURRENT_USER\Control Panel\Desktop\Win8DpiScaling from 0 to 1.
So Windows 10 will disable Windows 8.1 per-monitor scaling and revert to the Windows 7/8 behavior. This is equivalent to the checkbox “Let me choose one scaling levels for all my displays” in Windows 8.1 which Microsoft removed because it was too clear and helpful. The Settings app will now show “Custom” as the scaling level for all displays. If you change the slider back to a percentage value in the Settings app, you will once again disable system-wide scaling and re-enable per-monitor scaling. As of Windows version 10.0.10586, the Settings app also got a dedicated link to “Turn off custom scaling and sign out.”
At the bottom of the Control Panel page you see another section, Change only the text size. This truly ancient option allows resizing various non-client text individually. I’m not sure why anyone would want to do that, and I only bring it up because it’s confusingly disabled by default, i.e. when per-monitor DPI scaling is in effect. You must use a “custom” scaling level, i.e. enable system-wide DPI scaling, before it becomes accessible.
I have updated my central advisory page, High DPI Settings in Windows, with the above information. Let me conclude with a rant on the utter lack of clarity and documentation in Windows 10. Why does Microsoft try to obscure the fact that “custom” scaling disables per-monitor scaling? Moreover, hitting F1 or clicking a question mark icon no longer shows even some poor attempt at documentation. Now we merely get an insulting “How to get help in Windows 10” page in the web browser – which simply suggests a web search that usually comes up empty! Most open-source projects have better documentation.
8 thoughts on “DPI Settings in Windows 10”
Thanks for another helpful article. I posted on your main ‘High DPI Settings in Windows’ article about how Windows 10 appears to enable DPI Virtualization for 125% scaling (120DPI) by default so I’ve just been trying to follow the process you describe above to change this behaviour using ‘System wide scaling’.
However, having followed the steps and confirmed that my ‘Win8DpiScaling’ registry value is set to 1 I find that DPI virtualization still seems to be enabled for a non-DPI aware app I have written as a test.
There’s a screenshot showing this here:https://onedrive.live.com/redir?resid=C8076A28465AD232!780&authkey=!AEAXSSNo_qcg_6Y&v=3&ithint=photo%2cpng
The ‘Untitled’ window is my test app, which has blurry text and the width/height it is displaying are taken from SystemParametersInfo passing SPI_GETWORKAREA. The values have clearly been scaled by Windows by dividing the actual work area size by 1.25, which is another indication that DPI virtualization is enabled.
Okay, just checked this myself and you’re correct. Looks like Microsoft changed the defaults again so that DPI virtualization is now applied at all scaling levels in Windows 10, even when per-monitor scaling is disabled. So the only way to get back XP style scaling is now to “disable display scaling” for each individual application. I’ve corrected my articles accordingly, thanks for letting me know (again)!
Thanks for the confirmation
It’s not documentation per se but there’s this: https://blogs.technet.microsoft.com/askcore/2015/12/08/display-scaling-in-windows-10/
Thanks for the link. As you say it’s not user documentation but it’s a good comprehensive backgrounder. I’ll update the post accordingly.
Hi, do you know how to choose a dpi below 100?
You mean below 100%? Not possible as far as I know. 96 DPI (100%) is the minimum possible setting. It’s the baseline to which scaling factors greater than one are applied.