Windows 10的虚拟桌面
简介
Windows 10发布后,Windows系统外壳终于内置了虚拟桌面功能。虽然该功能有些跟随Mac多重桌面的嫌疑,但它的确极大方便了桌面组织。
首先,本文将介绍一些使用虚拟桌面的快捷键。然后,讨论使用IVirtualDesktopManager接口,在C#里实现追随虚拟桌面的代码。最后,谈谈Windows 10虚拟桌面和Windows Desktop API的区别。
使用虚拟桌面的快捷键
新建桌面:Ctrl+Win + D
删除桌面:Ctrl+Win + F4
上个桌面:Ctrl+Win + <-
下个桌面:Ctrl+Win + ->
如果记不清快捷键也没关系,可以用Win+Tab还呼出桌面管理视图。或者,用鼠标点击任务栏上的“任务视图”图标:
出现桌面管理视图后,用鼠标新建,删除,切换,以及移动窗口到其他桌面。
IVirtualDesktopManager接口
Windows SDK Support Team博客中,有一篇Chris Lewis1的文章《Virtual Desktop Switching in Windows 10》。它介绍了如何在C#里利用Windows Shell的VirtualDeskTopManager2,以及它的COM接口IVirtualDeskTopManager3来将当前窗口移动到活跃桌面的方法。这里给出简单的c#实现。
首先,在Visual Studio中新建一个WinForm项目,选用DotNet Framework4.0或以上都可以。
然后,在Form1.cs文件中,Form1类的后面,贴入如下COM调用声明:
public partial class Form1 : Form
{
//...
}
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("a5cd92ff-29be-454c-8d04-d82879fb3f1b")]
[System.Security.SuppressUnmanagedCodeSecurity]
public interface IVirtualDesktopManager
{
bool IsWindowOnCurrentVirtualDesktop([In] IntPtr TopLevelWindow);
Guid GetWindowDesktopId([In] IntPtr TopLevelWindow);
void MoveWindowToDesktop([In] IntPtr TopLevelWindow, ref Guid CurrentDesktop);
}
[ComImport, Guid("aa509086-5ca9-4c25-8f95-589d3c07b48a")]
public class CVirtualDesktopManager
{
}
接口和COM class的GUID可以在Shobjidl.h头文件中找到。
使用IVirtualDesktopManager接口,我们可以
- 判断是否当前窗口位于活动桌面上,
- 获取某个顶级窗口所在桌面的桌面标志,
- 将某个顶级窗口移动到目标桌面上。
在Form1的构造函数下,我们启用一个定时器。定时器每一秒将检查是否当前窗口位于活动桌面下。
如果用户切换到另外一个虚拟桌面,我们将尝试获取该活动虚拟桌面的标志,并将当前窗口移动到活动桌面下。
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsFormsAp