Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to disable a secondary monitor (with ChangeDisplaySettingsEx)?

I'm trying to follow the instructions on MSDN given here to disable a secondary monitor.

I'm trying to use specifically this set of functions to allow compatibility with older versions of Windows.

However, I can't manage to disable a monitor. I'm running and testing this on Windows 7 x64. All I get is a flickering screen. The code definitely detects the monitor properly - I managed to change resolution and view it's display modes easily.

Here are (parts) of my code - I tried a lot of variations on the fields for DEVMODE

DEVMODE    deleteScreenMode;
ZeroMemory(&deleteScreenMode, sizeof(DEVMODE));
deleteScreenMode.dmSize = sizeof(DEVMODE);
deleteScreenMode.dmDriverExtra = 0;
deleteScreenMode.dmFields = DM_POSITION | DM_PELSHEIGHT | DM_PELSWIDTH;
deleteScreenMode.dmPelsWidth = 0;
deleteScreenMode.dmPelsHeight = 0;

POINTL delete;
deleteion.x=0;
deleteion.y=0;
deleteScreenMode.dmPosition = deleteion;

LONG result = ChangeDisplaySettingsEx(devName, 
                                        &deleteScreenMode,
                                        NULL,
                                        CDS_UPDATEREGISTRY,
                                        NULL);

Does anyone have experience with this? Thanks

like image 876
Alex Avatar asked Oct 28 '13 19:10

Alex


Video Answer


1 Answers

I've decided to advance into a different problem - setting a primary display - and by pure luck I've stumbled into the solution. There are 2 conditions to disable a monitor that aren't specified anywhere: 1) You can't disable the monitor dynamically - you must use CDS_UPDATEREGISTRY to write it into the registry. 2) More importantly, for some weird reason, you must first store the change in the registry (with or without CDS_NORESET, it doesn't matter), and then use again ChangeDisplaySettingsEx with NULL values to make the changes happen. This might have something to do both monitors connected to the same display device, I'm not sure...

Anyway here is the code that worked for me:

result = ChangeDisplaySettingsEx(devName, &deleteScreenMode,
                                        NULL,
                                         CDS_UPDATEREGISTRY | CDS_NORESET ,
                                        NULL);
ChangeDisplaySettingsEx (NULL, NULL, NULL, NULL, NULL);

Hope it'll help someone somewhere someday.

like image 134
Alex Avatar answered Sep 21 '22 14:09

Alex