在 Windows 平台上模拟 Linux 的多桌面功能






4.87/5 (13投票s)
这是一个创建多个虚拟桌面并允许您在它们之间切换的简单工具。

引言
多桌面(工作区)功能在 Linux 上的 KDE/GNOME 中得到支持,并且也可以在 Mac OSX 上找到。
这个小工具可以在 Windows 平台上模拟此功能。
桌面函数
有一系列 API 用于维护桌面。
函数 | 描述 |
CloseDesktop |
关闭桌面对象的打开句柄。 |
CreateDesktop |
创建一个新的桌面,将其与调用进程的当前窗口站关联,并将其分配给调用线程。 |
CreateDesktopEx |
创建一个新的桌面,将其与调用进程的当前窗口站关联,并将其分配给调用线程。 |
EnumDesktops |
枚举与调用进程的当前窗口站关联的所有桌面。 |
EnumDesktopWindows |
枚举与指定桌面关联的所有顶级窗口。 |
GetThreadDesktop |
检索分配给指定线程的桌面句柄。 |
GetUserObjectInformation |
获取有关窗口站或桌面对象的信息。 |
GetUserObjectSecurity |
获取窗口站或桌面对象的安全信息。 |
OpenDesktop |
打开指定的桌面对象。 |
OpenInputDesktop |
打开接收用户输入的桌面。 |
SetThreadDesktop |
将指定的桌面分配给调用线程。 |
SetUserObjectInformation |
设置有关窗口站或桌面对象的信息。 |
SetUserObjectSecurity |
设置窗口站或桌面对象的安全信息。 |
SwitchDesktop |
使桌面可见并激活它。这使得桌面能够接收来自用户的输入。 |
如何创建一个新的桌面
下面的简单代码演示了如何创建一个新的桌面。
// create the new desktop
SECURITY_ATTRIBUTES stSecurityAttr = {sizeof(SECURITY_ATTRIBUTES), 0, TRUE};
stSecurityAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
stSecurityAttr.bInheritHandle = TRUE;
HDESK hDesktop = ::CreateDesktop( lpszDesktopName
, NULL
, NULL
, 0
, GENERIC_ALL
, &stSecurityAttr
);
if( hDesktop == NULL )
{
::MessageBox( m_hWnd, _T("Failed to create new desktop."),
_T("Error"), MB_ICONERROR | MB_OK);
return;
}
// start the Windows Shell(explorer.exe) on the new created desktop
STARTUPINFO stStartInfo = {0};
stStartInfo.cb = sizeof(STARTUPINFO);
stStartInfo.lpDesktop = (LPTSTR)lpszDesktopName;
PROCESS_INFORMATION stProcInfo = {0};
CString strCmdLine = _T("explorer.exe");
BOOL bRet = ::CreateProcess( NULL
, strCmdLine.GetBuffer()
, NULL
, NULL
, TRUE
, 0
, NULL
, NULL
, &stStartInfo
, &stProcInfo
);
strCmdLine.ReleaseBuffer();
if( !bRet )
{
::CloseDesktop(hDesktop);
::MessageBox( m_hWnd, _T("Failed to launch the explorer.exe
in the new desktop."), _T("Error"), MB_ICONERROR | MB_OK);
return;
}
::SwitchDesktop(hDesktop);
// sleep for 3 seconds for the shell ready
Sleep(3000);
// launch another instance on the new created shell
TCHAR tszBuffer[MAX_PATH] = {0};
GetModuleFileName( m_hInstance, tszBuffer, MAX_PATH);
bRet = ::CreateProcess( NULL
, tszBuffer
, NULL
, NULL
, TRUE
, 0
, NULL
, NULL
, &stStartInfo
, &stProcInfo
);
::CloseDesktop(hDesktop);
历史
- 2009 年 3 月 5 日:初始发布