与窗口工作站的进程连接

当进程首次调用 USER32 或 GDI32 函数(窗口工作站和桌面函数以外的)时,进程会自动建立与窗口工作站和桌面的连接。 系统根据以下规则确定进程连接到的窗口工作站:

  1. 如果进程已调用 SetProcessWindowStation 函数,它将连接到该调用中指定的窗口工作站。
  2. 如果进程未调用 SetProcessWindowStation,它将连接到从父进程继承的窗口工作站。
  3. 如果进程未调用 SetProcessWindowStation 并且未继承窗口工作站,则系统会尝试打开MAXIMUM_ALLOWED访问并连接到窗口工作站,如下所示:
    • 如果在创建进程时使用的 STARTUPINFO 结构的 lpDesktop 成员中指定了窗口工作站名称,则进程将连接到指定的窗口工作站。
    • 否则,如果进程在交互式用户的登录会话中运行,则进程将连接到交互式窗口工作站。
    • 如果进程在非交互登录会话中运行,则根据登录会话标识符形成窗口工作站名称,并尝试打开该窗口工作站。 如果打开作失败,因为此窗口工作站不存在,系统将尝试创建窗口工作站和默认桌面。

无法通过调用 CloseWindowStation 函数来关闭在此连接过程中分配的窗口工作站。

当进程连接到窗口工作站时,系统会在进程的句柄表中搜索继承的句柄。 系统使用找到的第一个窗口工作站句柄。 如果希望子进程连接到特定的继承窗口工作站,必须确保仅将所需句柄标记为可继承。 如果子进程继承多个窗口工作站句柄,则未定义窗口工作站连接的结果。

将进程连接到窗口工作站时,系统打开的窗口工作站的句柄不可继承。

与桌面的线程连接