windows子系统的用户界面管理有一个层次结构,通常应用程序只是在一个默认的桌面运行。每个子系统会话都有自己的会话空间,属于某个会话的资源将从该会话空间中分配。当用户登录到windows中时,操作系统将为该用户建立一个会话;即使用户通过远程桌面或者终端服务连接到一个系统中,系统也会为该用户建立一个单独的会话。
在一个会话中,有一个交互式窗口站,可能还有非交换式窗口站。在交互式窗口站中通常有三个桌面:登录桌面、默认桌面和屏幕保护桌面。通常运行的图形界面应用程序运行在默认桌面上。交互式窗口有独立的剪贴板、键盘、鼠标、显示器等,在三个桌面中,任何时刻只有有一个是激活的,输入输出设备归激活的桌面所有。
在每个桌面中都有一个顶级窗口列表,这些窗口往往可以相互重叠,有系统菜单、最大/最小化按钮和滚动条等,通常各个图形界面应用程序的主窗口属于当前桌面的顶级窗口。在windows中,窗口可以有子窗口,子窗口占据父窗口的客户区域。因此,卓面上的窗口形成了一个层次结构。实际上一个窗口总是可以构建它自己的子窗口。
windows为常用的窗口定义了一些窗口类(windows class),因而应用程序可以非常方便地创建这些窗口类的实例。应用程序如果要定义独特的窗口特性,可以生成一个窗口类,这个窗口类既可以是全新的,也可以是在系统已有窗口类的基础上定义得到。窗口类规定了其对象将如何响应各种消息,包括系统发送给它的消息和用户触发的消息。Windows窗口的编程模型是消息驱动的,每个窗口对象根据其窗口类指定的窗口过程来响应各种消息。
windows子系统会话有一个RIT(Raw Input Thread)线程,负责从输入设备读取原始输入事件。然后生成消息,寄送到正确的线程消息队列中。每个包含用户界面元素的线程都应该及时地处理这些消息。通常的做法是在一个消息循环中,不停地获取消息,再分发给目标窗口,由目标窗口过程来响应。