I added another new tool to my Tiny Tools Collection: ToggleDisplay
Code: https://github.com/sgrottel/tiny-tools-collection/tree/main/ToggleDisplay
Released Binary: https://github.com/sgrottel/tiny-tools-collection/releases/tag/ToggleDisplay-v1.0
It allows you to enable, disable, and toggle a display.
Why? My computer is connected to 2-3 displays. Two computer monitors on my desk for work. And a TV on the other side of the room, e.g. to play games from my computer or to watch video files in style.
Often enough I boot the computer, and then my mouse disappears from the desktop, because I forgot the TV was configured “on” before, and the mouse moved beyond the desktop monitors. Annoying. The built-in feature “Windows-Key + P” is understandably limited to two monitors. So, I always had to press “Windows + P”, then “Further Settings”, wait for the dialog to appear, fiddle around, press apply, … you get my point.
So, I researched the net a bit on how to programmatically enable or disable a display. And there are several free tools to do that. I tried two, and both did not work. Then there is a hack with using a Windows 10 executable on Windows 11. Yeah, no. Ok. Search on!
It turns out, there is an easy API for that: ChangeDisplaySettingsEx
. Some experimental code later I was able to deactivate the display, but not to (re-)activate it. Not good enough. Search on!
Some search later, turns out there is a second API, not as simple and with next to no useful documentation: SetDisplayConfig
. This one seems to be the API the windows built in display configuration dialog uses. But … how. I found code by “PuFF1k” on StackOverflow (https://stackoverflow.com/a/62038912/552373) who reverse engineered the API calls of the windows dialog. I tried his code, and it works. Nice! Thank you, PuFF1k!
The core of the trick is to not provide any modeInfo
data to SetDisplayConfig
, and to set all sourceInfo.modeInfoIdx
and targetInfo.modeInfoIdx
of all paths to DISPLAYCONFIG_PATH_MODE_IDX_INVALID
.
Some refactoring and some cleanup later, I have ToggleDisplay, ready to be shared with the world.
By the way, I now also included source code of some of my older tools in this Tiny Tools Collection repository:
I uses that opportunity to also update these projects to recent DotNet runtimes. I did not set up any automated build pipeline or releases. Maybe some other time.