28

Short Version

How can i force an application to be high-dpi scaled?

  • Pretend there is an application, who's developers manifested it as high-dpi aware, when it really isn't. How can i force dpi-scaling?

  • Pretend there is an applicaiton that Microsoft has applied the "HighDpiAware" compatiblity shim, when the application really isn't. How can i force dpi-scaling?

How can i force Windows to apply dpi-scaling to an application?

Long Version: What is high-dpi scaling?

Not all users run Windows at 96dpi. Not every button is supposed to be 75x23 pixels, not every toolbar is 25pixels high, and not every treeview glyph is 16x16. If the user has chosen a different dpi setting for Windows, you need to scale everything appropriately.

Problem is that almost no developers do their job by handling high-dpi settings nicely.

  • At best everything will stay "the same size", which means that every appears teeny tiny.
  • At worst forms are incorrectly laid out, with text being clipped, and controls not visible.

Starting with Windows Vista, and leveraging the power of Desktop Compositer, Microsoft gave up on developers doing their job, and now lie to application. They tell apps that the user is running at +96dpi. Windows then uses the video card, and Desktop Composition, to scale up the forms.

Pro: the form's content will be a nice readable size.
Con: everything will be slightly fuzzy.

This "high-dpi scaling" feature only works at the user's discretion, and requires:

  • Windows Vista or newer
  • Desktop Composition to be enabled
  • the user to turn off "Use Windows XP style scaling"
  • the user to not disable scaling for your application

As a developer, you can opt out of the high-dpi scaling; if you took the effort to write your application properly, and you know that you'll handle high-dpi properly. You opt out of this scaling by adding a manifest entry to your executable, declaring that you are "high-dpi aware".

The topic of how to make your application respect the user's preferences (including font face, font size, and dpi setting) is a question for stack overflow. As is the syntax for the manifest entry declaring your "high-dpi awareness".

This question, on super-user, is how to ignore a developer who went ahead and added a high-dpi aware manifest entry, when in fact the application isn't high-dpi aware. They told Windows to disable scaling, but they didn't actually test the application. There is software out there with a "high-dpi aware" manifest entry, and now the application is unusable under "large fonts" (e.g. 120dpi).

4
  • I'm interested in this as well. We have a critical application that is not dpi-aware and was originally designed for an 800x600 screen. Windows does not scale it by default, and it doesn't make a difference whether we're using XP, Vista, or 7. Since our staff spend most of their time in this 800x600 app, they insist on using their 20" LCD monitors at 800x600 resolution! This is a huge waste, and the self-inflicted lack of pixels gets in their way when they need to use MS Office, IE8, etc. Apr 9, 2010 at 19:56
  • 1
    It wasn't until Windows Vista that Microsoft began leveraging Desktop Composition (what some mistakenly call Aero) to use the graphics card to scale applications that don't specifically opt-out of the scaling. There was no scaling in XP, and you don't want scaling in Vista 7. You want your application to be properly written. Walk over to a developer's machine, and change their resolution back to 1050, and set the dpi to 168. Everything will be the same huge zoomed in tard-mode, except the app won't behave properly. Tell them they're not getting any food or water until it's fixed.
    – Ian Boyd
    Apr 23, 2010 at 0:53
  • We don't always have access to the developers that create the apps we use. If only we did...
    – Cylindric
    May 19, 2010 at 8:57
  • Forms = shapes?
    – jiggunjer
    Aug 18, 2017 at 9:08

4 Answers 4

6

Hmm. My suggestion would be to edit the manifest and remove the incorrect declaration. And don't forget to bug the developer about it however you can!

Edit: Note that it should be possible to simply place the manifest next to the executable, e.g. for foo.exe, you would place the manifest in foo.exe.manifest. See MSDN article (look in the section called "File Name Syntax").

3
  • i assume this is the only way to go. On the downside: it invalidates the appliation's digital signature.
    – Ian Boyd
    Aug 31, 2010 at 17:53
  • @Ian: it looks like you don't have to put the manifest in a resource.
    – SamB
    Sep 2, 2010 at 12:09
  • 3
    It used to be that a .manifest file took precedence over the manifest inside the executable. Today any manifest built into the executable overrides any external .manifest file. i don't remember which service pack of XP changed it - i think it was SP2.
    – Ian Boyd
    Sep 3, 2010 at 22:39
9

I just released a DLL that hooks and redirects calls to SetProcessDPIAware. For those applications that disable DPI scaling through code, this is a fast and easy fix (compared to binary patching).

DPIMangler: Blog post, source code.

6

You can still edit the manifest, you'll just have to edit it in the .EXE file itself. Look for a resource editor that has manifest support. An example with rudimentary support is XN Resource Editor.) Just find and delete the line that mentions HIGHDPIAWARE and save the executable.

Be sure to make a copy of the executable before you edit it, though!

1
  • "On the downside: it invalidates the appliation's digital signature."
    – Ian Boyd
    Sep 28, 2012 at 20:42
1

I wonder if ResizeEnable is what your looking for?

http://www.digitallis.co.uk/pc/ResizeEnable/

1
  • No, the windows already are resizable. The problem is when the compositor composites the window for display. Right now it is not doing anything special, as the application said it doesn't need to be scaled. But in fact the window does need to be scaled.
    – Ian Boyd
    Jun 3, 2010 at 16:58

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .