如何利用程序设置双显示器克隆模式,扩展模式等

wdz609 2010-03-03 01:24:51
在windows vista home版,第一次接入一个外接显示器后,系统会弹出一个菜单,让你设置extended模式或者mirrored模式。
如果选择了扩展模式,则就算在桌面属性中去掉secondary的"extend..."checkbox,按Fn+F4也不会变成mirrored模式。如果想变回mirrored,需要在桌面属性页点开"connect to a projector or other extenal display",在display这个项目下点"connect display"重新配置为mirrored模式(一旦改变mirrored为extended,也需要通过此方法改回)。

Fn+F4可完成只primary display显示,只secondary display显示,mirrored or extended模式。

现在我想用程序实现Fn+F4以及mirrored和extended切换等功能。
1、如何得到目前是哪种状态? -- mirrored、extended、只primary、只secondary
2、如何设置?

可行办法:
1、比较简单的,模拟Fn+F4这种按键实现,及模拟鼠标按键等调出"connect to ...."等完成。但xp,vista/win7不同,得特殊做。而且还不容易保证每次都成功。另外需要知道当前是何种模式。
未解决办法:
1、利用EnumDisplayDevices,EnumDisplaySettings,ChangeDisplaySettingsEx完成。
参考:http://support.microsoft.com/kb/308216及http://support.microsoft.com/kb/306399
跟据两篇文章,可以完成扩展模式与只primary显示的切换。但在去掉secondary显示后重启机器,还是扩展模式,即不能保存效果。也不知道怎么完成上面我提到的功能。
另外,我还发现我不大理解的地方,在各种模式下,EnumDisplayDevices得到的结果不一样。比如,在mirrored及只secondary显示模式下,我能得到\\.\DISPLAY1\Monitor0和\\.\DISPLAY1\Monitor1,而在extended及只primary显示模式下,我只能得到\\.\DISPLAY1\Monitor0。(此结果对应装有vista home basic的notebook)

针对上面两种功能,小弟我实在想不出来咋搞了~
谢谢大家
...全文
2476 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoutt1989 2012-07-18
  • 打赏
  • 举报
回复
请问你知道如何用程序实现fn+f4的组合键功能吗?
wdz609 2010-06-18
  • 打赏
  • 举报
回复
结贴了。感谢大家的关心,现奉上目前的解决方案。

获取当前模式部分:
假设当前机器仅有一块显卡(设定主显示器为Primary),连接第二块显示器(设定标记为Projector)后,设备管理器里只有两个monitor,拔掉secondary则又恢复成一个monitor。
比较幸运的是,通过EnumDisplayDevices得到每个monitor及device的settings中的flag是否有DISPLAY_DEVICE_ATTACHED_TO_DESKTOP,组合使用就可以知道当前是何种模式了。情况如下:
Primary模式:
可枚举到Display1及Display2,Display1下又可枚举到Monitor0,Monitor1,此时Display1及Monitor0均为DISPLAY_DEVICE_ATTACHED_TO_DESKTOP;
Clone模式:
可枚举到Display1及Display2,Display1下又可枚举到Monitor0,Monitor1,此时Display1及Monitor0,Monitor1均包含DISPLAY_DEVICE_ATTACHED_TO_DESKTOP;
Extended模式:
可枚举到Display1及Display2,Display1下又可枚举到Monitor0,Display2下可枚举到Monitor0,且均包含DISPLAY_DEVICE_ATTACHED_TO_DESKTOP;
Projector模式:
与Primary,Clone模式类似,在Display1下可枚举到Monitor0,Monitor1,但Display1及Monitor1包含DISPLAY_DEVICE_ATTACHED_TO_DESKTOP;
上面Display,Monitor后面的0,1等数字进表明序号。
由此,可以很方便的分辨出模式来。

当为双显卡时(高性能和省电模式),情况与单显卡类似,只不过会得到4个Display,因此,在进行上述判断时,首先确保得到了包含DISPLAY_DEVICE_PRIMARY_DEVICE的Display,然后在此基础上继续枚举,并套用上面的逻辑,即可判断。

但有一种情况需要特殊对待,机器为一个显卡,但却在设备管理器中显示为俩,同时monitor也变为三个(或者四个,忘记了)。这时再用上面的方式就不行了。就得像对待双显卡似的,利用DISPLAY_DEVICE_ATTACHED_TO_DESKTOP及Position等信息结合判断。
此种情况,个人怀疑是driver出现了两份。

切换部分变得简单了,系统被限制为windows 7。
于是我第一方案是发出win+p消息,此种方法是可行的,但有一个未知原因未解:当系统启动后,立即运行切换将会失败,必须手动进行一次win+p操作方可。而当系统启动一段时间后使用,则正常了。
第二方案,很幸运,我找到了Windows\System32\DisplaySwitch.exe,于是,切换变得简单了,直接加入internal,external,extend,clone进行切换了。

哈,这是我的方案。请了解。而xp下使用ChangeDisplaySettings下的方式应该仍然可以完成。
xwylpsy 2010-05-25
  • 打赏
  • 举报
回复
我现在也在做这方面应用,关注中。。。。
yuzl32 2010-03-03
  • 打赏
  • 举报
回复
友情UP





.

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧