如何禁用辅助监视器(使用ChangeDisplaySettingsEx)?

时间:2013-10-28 19:59:50

标签: c++ winapi multiple-monitors

我正在尝试按照MSDN given here上的说明禁用辅助监视器。

我正在尝试专门使用这组函数来兼容旧版本的Windows。

但是,我无法设法禁用显示器。我正在Windows 7 x64上运行并测试它。 我得到的只是一个闪烁的屏幕。代码肯定能正确检测显示器 - 我设法改变分辨率并轻松查看显示模式。

以下是我的代码的(部分) - 我在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);

有没有人有这方面的经验?感谢

2 个答案:

答案 0 :(得分:4)

我已经决定进入一个不同的问题 - 设置一个主显示器 - 并且纯粹的运气我偶然发现了解决方案。 有两个条件可以禁用未在任何位置指定的监视器: 1)您无法动态禁用监视器 - 您必须使用CDS_UPDATEREGISTRY将其写入注册表。 2)更重要的是,出于一些奇怪的原因,你必须首先将更改存储在注册表中(有或没有CDS_NORESET,这没关系),然后然后再次使用带有NULL值的ChangeDisplaySettingsEx来制作变化发生了。这可能与两个连接到同一显示设备的显示器有关,我不确定......

无论如何,这里的代码对我有用:

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

希望有一天它会帮助某个人。

答案 1 :(得分:0)

此处暗示了类似的解决方案:

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

这适用于附加屏幕。但是,即使拥有这些知识,关于如何分离屏幕的ChangeDisplaySettingsEx文档对于需要设置的DevMode字段也是错误的。正如您所注意到的,您不仅要设置DM_POSITION,还要设置DM_PELSHEIGHT | DM_PELSWIDTH。

在Windows 7中有一个新的SetDisplayConfig API,但我还没有个人经验。希望它有更好的记录!