2013-10-28 44 views
5

我试图按照MSDN given here上的说明禁用辅助监视器。如何禁用辅助监视器(使用ChangeDisplaySettingsEx)?

我想专门使用这组功能,以便与旧版本的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); 
领域

有没有人有这方面的经验?由于

+0

根据上述文章,'dmFields'掩码包含更多标志。也许必须设置(和相应的字段归零)来分离显示器? – valdo

+0

我试过了,它没有工作。在他们的例子中,他们使用所有可能的标志 - 当我这样做时,它会抱怨给定的模式是无效的。当我删除它的DM_BITSPERPEL标志时,它的结果不会改变。显示器轻弹并保持活动状态。 – Alex

回答

2

我已经决定要提前进入一个不同的问题 - 设置一个主显示器 - 由纯粹的运气,我迷迷糊糊到溶液中。 有2个条件,以禁止未指定任何地方的监视器: 1)您不能动态禁用显示器上 - 必须使用CDS_UPDATEREGISTRY它被写入到注册表中。 2)更重要的是,对于一些奇怪的原因,你必须先存储在注册表中(有或没有CDS_NORESET,不要紧)的变化,并再次然后使用ChangeDisplaySettingsEx与NULL值进行更改发生。这可能有些事情要连接到相同的显示设备两台显示器,我不知道......

反正这里是为我工作的代码:

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

希望它会帮助别人某天某处。

0

类似的解决方案是在暗示这里:

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

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

在Windows 7中有一个新的SetDisplayConfig API,但我与它没有亲身经历呢。希望它有更好的记录!