11

I've got a laptop with a 2560 x 1440 display, connected to 2 external 1080p monitors. The scaling is fine normally, with the native monitor at 125% and the 1080p monitors at 100%, but when I undock the laptop, sometimes the laptop goes to 200% scaling factor and I need to reset it manually in display settings.

I would like to find a command that emulates the setting here, such that I don't need to right click on the desktop and open display settings every time I unplug my external monitors:

enter image description here

The only registry keys/PowerShell commands I've found for this require logging out to take effect, which doesn't seem necessary given the GUI setting can take effect immediately.

Giacomo1968
  • 53,069
  • 19
  • 162
  • 212
Justin
  • 113
  • 1
  • 1
  • 7
  • You can have a look at this answer too: https://superuser.com/a/1407846/195091 – yossico Nov 11 '20 at 11:54
  • See also [my answer here](https://superuser.com/a/1792335/177522) that tells you how to do this automatically upon connect/disconnect of an external monitor. – jan-glx Jun 28 '23 at 19:58

2 Answers2

10

Below is a batch script that will emulate the keyboard strokes to manipulate the GUI to adjust the Scale and layout options and Change the size or text, apps, and other items when it runs. This uses ms-settings:display to open the Display screen, and then it presses the tab key once and the up arrow 5 times using sendkeys to adjust the scale accordingly. It will press Alt+F4 at the end keys to close the screen once it completes. This method builds a dynamic vb script with a batch script and then executes the vb script with cscript to emulate pressing the keyboard keys.


Batch Script

Note: Just save this to a text file with a .bat or .cmd extension and execute it to run.

@ECHO OFF

explorer ms-settings:display
ping -n 2 127.0.0.1 > nul

:VBSDynamicBuild
SET TempVBSFile=%tmp%\~tmpSendKeysTemp.vbs
IF EXIST "%TempVBSFile%" DEL /F /Q "%TempVBSFile%"
ECHO Set WshShell = WScript.CreateObject("WScript.Shell") >>"%TempVBSFile%"
ECHO Wscript.Sleep 500                                    >>"%TempVBSFile%"
ECHO WshShell.SendKeys "{TAB}{UP 5}"                      >>"%TempVBSFile%"
ECHO Wscript.Sleep 500                                    >>"%TempVBSFile%"
ECHO WshShell.SendKeys "%%{F4}"                           >>"%TempVBSFile%"

CSCRIPT //nologo "%TempVBSFile%"
EXIT

Further Resources

Vomit IT - Chunky Mess Style
  • 40,038
  • 27
  • 84
  • 117
  • @Justin - Let me know how it goes when you test this. The `{Tab}` and `{Up 5}` may need adjusted but from a larger scale to a smaller scale on my system it was just one tab and then a few up arrow presses but I put 5 because it can go up once at 100% more than that and it'll stay at 100% still from what I tested. The number [`#`] next to the `{TAB #}` or `{UP #}` indicates the number of times that key needs to be pressed on the GUI to go to each option so these may be different on your system but I tested as best I could here and that's what seems to work for me. – Vomit IT - Chunky Mess Style Jun 28 '18 at 05:44
  • 2
    Perfect. I had to modify it a bit to send more {Tab}s but this definitely will do the trick. – Justin Jun 28 '18 at 19:05
  • 1
    I had to use 2 tabs in order to make this change the scale settings `ECHO WshShell.SendKeys "{TAB 2}{UP 6}" >>"%TempVBSFile%"` – GPPK May 07 '19 at 11:50
10

There's a command line app called SetDPI

darwish
  • 301
  • 3
  • 7
  • I've tested this and can confirm that it works well. The pre-compiled release contains a single binary that allows you to set the DPI using e.g. `SetDPI.exe 150` – dominik andreas Mar 04 '22 at 07:09
  • Thank you so much for this easy solution. For me it was TAB 2 and DOWN 1 / UP 1 to switch between 100% and 125%. I created two bat files and added a shortcut for each witth a hotkey attributed. – Tom Jun 08 '22 at 19:53
  • This should be the best answer, thankyou – infantry Jun 06 '23 at 08:03