Sessions, Window Stations and Desktops


总的来说,他们的关系如下:

Sessions, Window Stations and Desktops


我们知道Windows是支持多用户的,Session可以理解为每个用户登录,比如当前登录和远程登陆。
Window Stations可以理解为登陆后的不同用户组,我们在任务管理器中可以看到不同的用户名(比如 Richard, system, local service等),其中只有一个活动Station WinSta0, 只有这个Station是接受用户鼠标键盘输入的。而WinSta0 Station 又包括3个Desktop(包括Winlogon, Disconnect, Default), 其中Winlogon指的是登陆Desktop,当我们按Ctrl+Alt+Del时就会进入该Desktop;Disconnect指的是屏保Desktop; Default指的就是我们平时有任务栏的Desktop, 当然真正的Default Desktop是没有应用程序的在上面的,我们看到的桌面其实是启动Shell Explorer后的界面。


总结几点和我们平时写程序有关的: 
(1)我们平时写程序时指的桌面,比如GetDesktopWindow(), 得到是Shell Explorer创建的一个窗口,和WinStation内的Desktop概念不一样。
(2)我们可以通过CreateDesktop, OpenDesktop, SwitchDesktop等API创建和切换Desktop。
(3)我们平时写服务程序时发现窗口弹不出来, 因为服务不是运行在Station WinSta0下面. 通过FindWindow也找不到我们要找的窗口,因为它下面没有我们的当前的Shell Desktop。
(4)一个window station 对象包括一个剪贴板、一个全局原子集和多个Desktop对象, 所以你可以在多个Desktop之间通过剪贴板传送数据.
(5)所有的进程都和Session, WinStation, Desktop相关联,所以我们可以把它表示成这样一个路径: Session 1\WinSta0\Default, 这样我们也就理解为什么有些API需要我们传类似这样的信息.


参考资料: 

Pushing the Limits of Windows: USER and GDI Objects
Virtual Desktop: A Simple Desktop Management Tool

你可能感兴趣的:(Sessions, Window Stations and Desktops)