65.9K
CodeProject 正在变化。 阅读更多。
Home

Vista 缩略图增强型虚拟桌面管理器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.52/5 (9投票s)

2007 年 2 月 24 日

7分钟阅读

viewsIcon

86781

downloadIcon

910

一个功能齐全的虚拟桌面管理器,通过全屏桌面预览得到增强,并使用 Vista 的缩略图 API 渲染可拖放的实时窗口缩略图。

前往 CodePlex 项目站点获取最新版本和源代码。

Screenshot - virtualdesktop.png

引言

大多数开发者常常同时打开许多窗口,因此经常使用虚拟桌面程序来帮助组织他们的窗口。然而,大多数虚拟桌面软件都很丑陋,并且缺少许多有用的功能。虽然我没有将您可能想要的所有功能都放入此程序中,但我确实提供了一个功能强大的 Vista 缩略图增强型虚拟桌面程序的基础实现。

如何使用该程序

显然,您需要 Windows Vista 才能使用此程序。它在 RC1 上进行了测试,一些旧版本具有不同的缩略图 API 函数,可能会失败。当您第一次启动程序时,一个窗口会闪现并关闭。一个新图标现在位于系统托盘中。它安装了以下热键

  • Windows 键 + Z - 打开切换器
  • Windows 键 + 数字键盘 1...4 (数字锁定键打开) - 切换到桌面 x

当您按下 Windows 键 + Z 时,所有内容都会开始淡入黑色,您打开的任何窗口都将作为缩略图出现在左上角的第一个桌面上。您可以拖动窗口,它们会实时移动。如果您将它们拖到不同的桌面,它们会消失。要在桌面之间移动,可以双击桌面上的一个窗口,或者使用箭头键选择一个桌面,然后按回车键切换到它。您也可以按 Escape 键隐藏切换器。

每次切换桌面时,切换器窗口都会提供切换的视觉表示。

如果您右键单击托盘图标,将显示标准选项和用于在桌面之间切换的菜单。

工作原理

我将按类介绍程序的内部结构。为了让一切正常运行,需要很多技巧。我不仅有在其他项目中会有用的类,还有一个我将在另一篇文章中介绍的名为 PPAB Forms.dll 的库。这个库包含许多有用的图形函数,最重要的是,它提供了一个名为 Form 的类,该类继承自 System.Windows.Forms.Form ,并显示一个“分层窗口”。如果您不知道什么是分层窗口,它是一种特殊的窗口,经过合成,可以具有逐像素的 alpha 信息(PPAB 代表逐像素 alpha 混合)。没错,在 Vista 和 DWM 之前,就已经有分层窗口了。您可以使用它们来完成各种图形任务。如果您使用过 Object Desktop、Konfabulator、ObjectDock 等,或者看过旧版 Adobe Reader 的 alpha 混合启动屏幕,那么您就已经见过分层窗口在运行。

Thumbnail 类

这个类主要封装了 Vista 缩略图 API。你给它源窗口和目标窗口。然后,你设置一些属性并调用 UpdateRendering。这会开始渲染。它是可处置的,因此你可以通过调用 dispose 来完全停止渲染。

WindowInfo 类

这是项目中最大的类。它将 30 多个 Windows API 函数封装到一个功能齐全的窗口控制器中。只需在创建时将窗口句柄传递给它,它就会为您提供对大量有用属性的访问权限。您还可以设置几乎所有属性。我并没有将此类的所有内容都用于虚拟桌面。事实上,我只使用了几个函数和属性。还有一些共享(静态)函数,它们也封装了 FindWindow EnumWindows 。我可以看到这个类在许多程序中都有很大的用途。我可能会继续扩展它并发布另一篇文章来介绍它。

HotKey 类

此类别提供基于事件的热键管理器。使用热键的 ID 和按键本身调用 RegisterHotKey 。然后,监听 HotKeyPressed 事件,并检查给定事件的 ID 以处理热键。

NativeWindowEx 类

这个类被 HotKey 类使用。它只是继承了 NativeWindow 类,并添加了一个从 WndProc 调用的事件。它允许你处理 NativeWindow 消息,而无需每次都继承 NativeWindow

VirtualDesktop 和 VirtualDesktopManager 类

这些类在同一个文件中,因为它们相互使用。它们构成了基本的虚拟桌面“引擎”。我发现这个实现相当可靠,但请记住,在调试虚拟桌面程序时,如果其他桌面上有窗口,您必须正常结束程序,而不是点击“停止”。否则,窗口将保持隐藏状态,直到您注销(这可不好玩)。程序启动时,它会调用 InitVirtualDesktops ,参数为 4,表示要创建多少个桌面。没错,这个虚拟桌面引擎支持您想要的任意数量的桌面。但是,基于缩略图的预览窗口目前只支持 4 个。

ThumbnailWindow 和 ThumbnailManager 类

这些类实际上控制着预览窗口。实际上是预览窗口**们**。许多人向微软抱怨缩略图 API。这些 API 本身并不强大,只提供了一些关于如何绘制它们的选项。您无法仅仅使用这些 API 创建像 Flip3D 这样的程序。Flip3D 内置于 DWM 程序中,其工作原理是简单地对窗口应用矩阵变换。

我不需要这个程序中的任何 3D 功能,但我确实需要快速的 2D 动画。当拖动窗口时,它们需要移动并快速淡入。大多数其他缩略图程序使用缩略图 API 来移动、缩放和 alpha 混合它们的缩略图。API 通常不够快,无法提供流畅的动画(尤其是在较慢的计算机上),所以我提出了一个技巧。首先,每个缩略图都在自己的窗口中。现在,如果您为此使用常规窗口,半透明的玻璃区域将不会半透明。相反,我发现 Windows 允许您为此使用分层窗口。基本上,您创建分层窗口并告诉它像在普通窗口上一样在其上渲染。然后,为了使窗口具有触敏性,您必须将像素着色为除 0,0,0,0 以外的颜色。所以我只是用 1,0,0,0(1/255 alpha,黑色)填充一个与缩略图大小相同的矩形。您最终得到一个完美的半透明浮动缩略图。

一旦我弄清楚如何这样显示缩略图,我就编写了 ThumbnailWindow ThumbnailManager 类。 ThumbnailWindow 类继承自分层窗口类 (PerPixelAlpha.Form)。它们相互访问以控制动画和缩略图所代表的窗口。使用 ThumbnailWindow 类的修改版本,您可以随时在桌面上显示高度动画的浮动缩略图!

DoubleBufferedForm 类

这只是继承自 System.Windows.Form 并在构造函数中将 DoubleBuffered 属性设置为 true

MainForm 类

此类别仅提供启动代码并设置所有内容,包括系统托盘图标。它还处理热键按下并调用所需的函数。

SwitchForm 类

此窗体是一个可穿透点击的分层窗体,在用户切换桌面时显示。重要的绘图代码是 RenderDesktops 方法。

OptionsForm 类

此窗体包含一些有用的选项,包括可以拥有超过 4 个桌面(尽管预览窗口不显示超过 4 个)。

结论

该程序提供了一个很好的例子,说明如何将 Vista 缩略图用于功能性目的。您还可以轻松使用 ThumbnailWindow 类进行其他缩略图动画。例如,您可以制作 Alt-Tab 的替代版本,让窗口缩略图从屏幕顶部淡入并落下。它还为您提供了一个非常可靠的虚拟桌面引擎。最后,它为您提供了一些非常方便的 Win32 API 包装器,可用于几乎任何事物。

历史

© . All rights reserved.