Windows系统 也玩多个桌面

编程学堂

与Linux等操作系统一样,Windows系统也能支持多个桌面,只是Windows系统默认只支持单个桌面而已。

我们开发一个程序让Windows系统支持多个桌面(程序下载地址:http://www.icpcw.com/bzsoft),该程序可以创建新的桌面,并通过组合键操作的方式实现桌面之间的切换。

程序使用VC++开发,使用RegisterHotKey函数注册组合键,使用CreateDesktop、Open

Desktop等函数创建和打开新的桌面。程序没有图形界面,运行之后,按下组合键“Alt+Ctrl+Shif+1”,便会切换到新桌面。

27-f14-1.jpg
切换前
27-f14-2.jpg
切换后

重要知识点

Windows桌面操作由WindowStation和 Desktop配合完成,要设计这类程序,需要对这两个知识点有所了解。

WindowStation

WindowStation就是“窗口站”。窗口站是一个安全对象,包含一个剪贴板,一系列的全局钩子以及一组桌面对象。分配给一个交互式用户登录会话的窗口站,它包含键盘,鼠标和显示设备。交互式的窗口站对用户可见并且能接受用户的指令。

Desktop

Desktop就是“桌面”。桌面是包含在窗口站中的安全对象,一个Windows的窗口站能有多个桌面,仅有可交互的窗口站的桌面能正常显示。在一个可交互的窗口站中,同一时刻仅有一个活动桌面。活动桌面也被称为输入桌面。

开发步骤

第一步:创建项目

打开Visual Studio,点击菜单项“新建项目”,在弹出的新建对话框中,选择“Win32项目”,填写项目名称“MyDesktop”,点击“确定”,在“Win32应用程序向导”中,勾选“空白项目”选项,点击“完成”,创建一个空白的Win32项目。

然后在“解决方案资源管理器”中右击“源文件”,点击“添加”→“新建项”,添加一个名称为“MyWinMain”的空白cpp源文件。

第二步:添加桌面切换函数

在刚刚创建的MyWinMain.cpp文件中,添加函数BOOL SwitchToDefaultDesktop(int id),其关键代码如下(完整代码下载地址:http://www.icpcw.com/bzsoft):

hDesk = OpenDesktop(lpszName, 0, FALSE, DESKTOP_SWITCHDESKTOP); // 打开Desktop对象

if (hDesk)

{

if (SwitchDesktop(hDesk)) // 切换到Desktop

{

bRet = TRUE;

}

else

{

bRet = FALSE;

}

CloseDesktop(hDesk); //关闭句柄

}

else

{

if (ID_SWITCHTODEFAULT == id)

{

return FALSE;

}

hDesk = CreateDesktop(lpszName, NULL, NULL, 0, GENERIC_ALL, NULL); // 创建Desktop对象

if (hDesk)

{

// 在新桌面启动Explorer

hOriginalThread = GetThreadDesktop(GetCurrentThreadId());

SetThreadDesktop(hDesk);

SwitchDesktop(hDesk);

第三步:定义主入口函数

添加函数VOID MyWinMain,并定义其为程序的主入口函数:#pragma comment(linker, "/Entry:MyWinMain")。该函数负责注册组合键,执行切换操作。关键代码如下(完整代码下载地址:http://www.icpcw.com/bzsoft):

hMutex = CreateMutex(NULL, FALSE, TEXT("MyDesktop_Mutex")); // 创建互斥量,只运行一个实例

if (!hMutex)

{

ExitProcess(0);

}

if (ERROR_ALREADY_EXISTS == GetLastError())

{

CloseHandle(hMutex);

ExitProcess(0);

}

for(;;)

{

if (GetMessage(&msg, NULL, 0, 0)