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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.87/5 (13投票s)

2009 年 3 月 5 日

CPOL

1分钟阅读

viewsIcon

41742

downloadIcon

1327

这是一个创建多个虚拟桌面并允许您在它们之间切换的简单工具。

2.jpg

引言

多桌面(工作区)功能在 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 日:初始发布
© . All rights reserved.