如何在没有物理硬件的情况下利用多显示器设置的功能?

S.R*_*ond 11 c# c++ windows winapi windows-8

过去几天我花了很多时间研究是否可以使用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.通过尝试跟踪应用程序并强制它们隐藏在用户定义的监视器组之间来伪造它.

商用和免费应用程序(如DisplayFusionFinestra Virtual Desktops)似乎都使用了一个高度复杂且复杂的跟踪已启动应用程序的系统,并试图在用户在虚拟监视器之间切换时隐藏和取消隐藏它们.

这是最可行的解决方案,因为它基本上满足所有要求.但它是一个黑客 - 有些应用程序并没有真正使用它,并且有许多极端情况会失败.


我在这里错过了什么?到目前为止,我的研究是否有误?我还没有检测到API的哪些区域?

ama*_*bhu 1

开发一个可以从单个物理显示器利用多个物理显示器配置中的功能的应用程序

Windows API 将每个桌面与资源管理器进程联系起来,任务栏、通知等按每个桌面进行管理。可以通过创建新的桌面对象来使用此 API 创建新的虚拟桌面。然而,如果您试图创建相当于 Linux 发行版中的工作空间的东西,那么您就不走运了。桌面对象管理在进程树下启动的应用程序,并且由于 Windows 资源管理器处理工作的方式,不可能在这些桌面对象之间移动应用程序等。

解决方案

在这里,我将介绍一些我发现的建议解决方案,以及为什么它们不起作用(据我所知)。

实现接近工作空间的东西的唯一方法就是伪造它 -

每个工作区及其进程必须通过插槽显示在任务栏/通知区域中。但这是非常难以实现的,游戏、全屏应用程序等必然会被破坏。我也不知道Win8下会怎样。所以是的,Windows 中的工作区从一开始就会很糟糕。

  • 好吧,希望一旦我制作了一个将渲染降低为空的虚拟驱动程序,我就可以在各种视图之间切换主物理显示器,就像用户想要交换共享桌面端一样。不幸的是,我正在努力研究虚拟驱动程序。我根本找不到很多资源来走这条路。你的最后一个问题是我自从开始这篇文章以来一直在权衡的一个问题——如果我找不到一个优雅的解决方案,我将不得不悲伤地离开这个问题。 (4认同)
  • 虚拟显示驱动程序也不是完整的解决方案。例如,即使在您编写了一个之后,您也必须设法使它们显示在单个屏幕中并在它们之间切换。这可能不会带来出色的用户体验,因为您不会拥有其他解决方案提供的附加功能。恕我直言,启动每个桌面并使其在后台运行所消耗的内存将是巨大的。然而,优点是您将拥有真正的工作区/应用程序切换体验。问题是——值得这么麻烦吗? (3认同)