处理与窗口工作站的连接

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

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

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

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

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

与桌面的线程连接