How to disable a secondary monitor (with ChangeDisplaySettingsEx)?

牧云@^-^@ 提交于 2019-12-19 18:56:52

问题


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


回答1:


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.




回答2:


A similar solution is hinted at here:

http://support.microsoft.com/kb/308216

This works for attaching screens. However, even armed with that knowledge, the ChangeDisplaySettingsEx documentation on how to detach a screen is also wrong about the DevMode fields that need to be set. As you noticed, you have to set not only DM_POSITION, but also DM_PELSHEIGHT | DM_PELSWIDTH.

In Windows 7 there's a new SetDisplayConfig API, but I have no personal experience with it yet. Hopefully it's better documented!



来源:https://stackoverflow.com/questions/19643985/how-to-disable-a-secondary-monitor-with-changedisplaysettingsex

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!