createDesktopExA 函数 (winuser.h)

创建具有指定堆的新桌面,将其与调用进程的当前窗口工作站相关联,并将其分配给调用线程。 调用进程必须具有关联的窗口工作站,由系统在进程创建时分配,或者由 SetProcessWindowStation 函数设置。

语法

HDESK CreateDesktopExA(
  [in]           LPCSTR                lpszDesktop,
                 LPCSTR                lpszDevice,
                 DEVMODEA              *pDevmode,
  [in]           DWORD                 dwFlags,
  [in]           ACCESS_MASK           dwDesiredAccess,
  [in, optional] LPSECURITY_ATTRIBUTES lpsa,
  [in]           ULONG                 ulHeapSize,
                 PVOID                 pvoid
);

参数

[in] lpszDesktop

要创建的桌面的名称。 桌面名称不区分大小写,不能包含反斜杠字符 (\) 。

lpszDevice

此参数是保留的,必须为 NULL。

pDevmode

此参数是保留的,必须为 NULL。

[in] dwFlags

此参数可以为零或以下值。

含义
DF_ALLOWOTHERACCOUNTHOOK
0x0001
允许在桌面上的其他帐户中运行的进程设置此进程中的挂钩。

[in] dwDesiredAccess

请求的桌面访问权限。 有关值列表,请参阅 桌面安全和访问权限

此参数必须包含DESKTOP_CREATEWINDOW访问权限,因为 CreateDesktop 在内部使用句柄创建窗口。

[in, optional] lpsa

指向 SECURITY_ATTRIBUTES 结构的指针,该结构确定是否可由子进程继承返回的句柄。 如果 lpsa 为 NULL,则无法继承句柄。

结构的 lpSecurityDescriptor 成员指定新桌面的安全描述符。 如果此参数为 NULL,则桌面将从父窗口工作站继承其安全描述符。

[in] ulHeapSize

桌面堆的大小(以 KB 为单位)。

pvoid

此参数是保留的,必须为 NULL。

返回值

如果函数成功,则返回值是新创建的桌面的句柄。 如果指定的桌面已存在,则函数会成功并返回现有桌面的句柄。 使用完句柄后,调用 CloseDesktop 函数将其关闭。

如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

注解

如果 dwDesiredAccess 参数指定READ_CONTROL、WRITE_DAC或WRITE_OWNER标准访问权限,则还必须请求DESKTOP_READOBJECTS和DESKTOP_WRITEOBJECTS访问权限。

可创建的桌面数量受系统桌面堆大小的限制。 桌面对象使用堆来存储资源。 可以通过增加桌面堆的大小或减少交互式窗口工作站中每个桌面保留的默认堆来增加可创建的桌面数。 此值在以下注册表值的 SharedSection 子字符串中指定: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\Windows。 此注册表值的默认数据如下所示:

%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16

SharedSection 子字符串的值描述如下:

  • 第一个 SharedSection 值是所有桌面通用的共享堆的大小(以 KB 为单位)。
  • 第二个 SharedSection 值是在交互式窗口站 WinSta0 中创建的每个桌面所需的桌面堆大小(以千字节为单位)。
  • 第三个 SharedSection 值是在非交互式窗口工作站中创建的每个桌面所需的桌面堆大小(以千字节为单位)。

桌面堆的默认大小取决于硬件体系结构等因素。 若要检索桌面堆的大小,请使用 UOI_HEAPSIZE调用 GetUserObjectInformation 函数。

注意

winuser.h 标头将 CreateDesktopEx 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名的使用与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定

要求

要求
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 winuser.h (包括 Windows.h)
Library User32.lib
DLL User32.dll

另请参阅

CloseDesktop

台式机

SECURITY_ATTRIBUTES

SetProcessWindowStation

SwitchDesktop

窗口工作站和桌面函数