过去几天我花了很多时间研究是否可以使用Windows API(最好是Windows 8)来开发一个可以利用单个物理监视器中的多个物理监视器配置中的功能的应用程序.据我所知,你根本做不到,或者根本就没有记录.下面我将介绍我的问题以及我所进行的研究,希望有人可以提供一些我尚未遇到的知识.
问题
在Windows 7+中,多显示器配置能够利用一些很酷的桌面功能,例如能够使用跨越多个显示器的单个大型桌面,在它们之间拖动无缝应用程序,切换是否具有任务栏跨度的能力等等.
虚拟屏幕(MSDN链接).
我希望能够访问此API并允许我的应用程序使用它来允许用户从单个物理监视器有效地拥有多个虚拟桌面.就那么简单.
解决方案
在这里,我将介绍我发现的一些解决方案,以及为什么它们不起作用(据我所知).
1.使用Window Station和Desktop API创建全新的桌面并在它们之间切换.
"窗口站是与进程关联的安全对象,包含剪贴板,原子表和一个或多个桌面对象.桌面是窗口站中包含的安全对象.桌面具有逻辑显示表面并包含用户界面对象,如窗口,菜单和钩子." MSDN链接.
这是一种在Windows中有效创建多个桌面的非常简洁的方法,允许用户在单个监视器之间切换.但它有以下几点警告:
"Windows没有提供将窗口从一个桌面对象移动到另一个桌面对象的方法,并且因为必须在每个桌面上运行单独的Explorer进程以提供任务栏和开始菜单,所以大多数托盘应用程序仅在第一个桌面上可见." TechNET上的Sysinternals.
2.尝试创建虚假显示驱动程序以强制Windows认为它有多个监视器.
这似乎是几个现有类似应用程序(如ZoneScreen)的有效选项.但是在Windows 7中,安装未签名的驱动程序变得很困难,而在Windows 8中,它似乎是不可能的.
3.通过尝试跟踪应用程序并强制它们隐藏在用户定义的监视器组之间来伪造它.
商用和免费应用程序(如DisplayFusion和Finestra Virtual Desktops)似乎都使用了一个高度复杂且复杂的跟踪已启动应用程序的系统,并试图在用户在虚拟监视器之间切换时隐藏和取消隐藏它们.
这是最可行的解决方案,因为它基本上满足所有要求.但它是一个黑客 - 有些应用程序并没有真正使用它,并且有许多极端情况会失败.
我在这里错过了什么?到目前为止,我的研究是否有误?我还没有检测到API的哪些区域?