Windows系统 也玩多个桌面
编程学堂
与Linux等操作系统一样,Windows系统也能支持多个桌面,只是Windows系统默认只支持单个桌面而已。
我们开发一个程序让Windows系统支持多个桌面(程序下载地址:http://www.icpcw.com/bzsoft),该程序可以创建新的桌面,并通过组合键操作的方式实现桌面之间的切换。
程序使用VC++开发,使用RegisterHotKey函数注册组合键,使用CreateDesktop、Open
Desktop等函数创建和打开新的桌面。程序没有图形界面,运行之后,按下组合键“Alt+Ctrl+Shif+1”,便会切换到新桌面。


重要知识点
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)