@martin: The problem is that with a wider delta between DPIs, the unscaled window becomes comically large and nearly unusable.
Compare these two videos showing a WinSCP window and a Chrome window being moved from a 4K, 200 DPI display to a regular 96 DPI display (apologies for the bad phone video):
WinSCP:
https://www.youtube.com/watch?v=xeOevWR-J5U
Chrome:
https://www.youtube.com/watch?v=OoJ1NxRTqGk
I believe that claiming to support per-monitor DPI awareness when the application does not actually support DPI scaling is way worse than a little blurriness due to bitmap scaling. I expect my windows to maintain their physical size when moving them between monitors, and it's difficult to use the app when its contents are 2x or more larger than they should be physically.
In the first version of Windows 10, efforts to implement per-monitor DPI scaling were hindered because Windows did not actually scale the non-client area (titlebar etc) of the window, so even if you scale the contents of your window, the window chrome still looks ridiculous on low-DPI displays (see
this ConEmu issue).
The good news is the Windows 10 Anniversary Update (v1607) adds a new API:
EnableNonClientDpiScaling(hWnd)
. Just call this once when the window is created and windows will automatically scale the non-client area for you. This means that you then need to listen for
WM_DPICHANGED
, use the suggested new pixel dimensions in
lParam
to call
SetWindowPos
(so that the window maintains the same physical [inch] dimensions on the new display), and then rescale the contents of the window.