在“locking”屏幕后面会发生什么?

我一直在研究Windows自动化和监控。

当我locking一台Windows机器的屏幕时究竟发生了什么?

目前我正在使用Windows 7,如果切换到Vista或服务器版本,行为是否有很大差异? 还有一个可以通过api访问的桌面吗? 我知道我仍然可以发送按键和鼠标点击到特定的窗口(通过ControlSend和ControlClick ),但似乎没有“桌面”本身。

是否有人能够对这件事情有所了解,或者将我指向一个可读的来源,在那里我可以概览这个话题?

基本上,Windows会切换到安全桌面,使其成为当前的桌面,所以输入现在与之相关联。

旧的桌面仍然保留在原来的位置:桌面上的所有HWND仍然存在,并且连接到该桌面的任何线程仍然可以访问这些HWND,获取它们的位置等等。 您仍然可以将消息发送到此桌面上的窗口,只要发送消息的线程也在该桌面上。

但是,由于桌面现在处于非活动状态,因此无法接收输入。 GetForegroundWindow将返回NULL(IIRC),并且不能再使用SendInput,因为现在输入属于另一个桌面上的[线程]; 那个不活动的桌面上的控件不能获得焦点。

请注意,将按键消息发送给没有焦点的控件有时会导致意外的行为,因为应用程序或控件一般不会期望在没有首先获得焦点的情况下接收键盘输入。 (这对于在WM_SETFOCUS中设置某种输入上下文的控件可能会有问题,例如,在WM_KILLFOCUS中将其清除。)

简而言之,用户界面仍然存在:您可以对其进行某些查询,但是您不能像常规桌面上发送输入一样自动执行该操作,而与焦点或输入有关的其他某些功能可能会失败。

我不是超级熟悉AutoHotKey,但功能的名称和描述表明,它严重依赖于底层的Win32 SendInput API。 当桌面不活动时,这对键盘输入根本不起作用。

有关桌面如何工作以及如何与winstations,锁定的桌面等相关的合理概述,请查看MSDN上的桌面文章 。

过去我遇到过的一个问题就是:如何使用某种形式的用户输入自动化(鼠标,键盘模拟)离开一个长期运行的测试,但是仍然锁定我的电脑,以便有人可以不要走过去干扰它。 一旦你锁定了电脑,桌面就无法工作,自动停止工作。 类似的问题发生在屏幕保护程序启动时:桌面开关,自动化失败。

一个解决方案是使用两台PC:我们称它们为Main和Test:从Main打开远程终端服务客户端到测试机器上,然后在测试机器上运行自动化测试,但是从Main上的终端服务客户机窗口机。 现在很酷的部分:你可以最小化TSC窗口,甚至锁定主机(或让屏幕保护程序启动),那个虚拟会话将继续工作,认为它仍然是活动的 – 只是没有人付钱注意。 这是一种用活动桌面创建“连接”会话的方法,但是这种方式没有人会干涉,因为它在主机的锁定桌面后面受到保护。

我不知道细节,但我相信锁屏构成一个单独的“桌面”,也许也是一个单独的“窗口站”(据我所知,窗口站只是一个桌面容器)。 有关窗口站MSDN部分应希望是有用的: http : //msdn.microsoft.com/en-us/library/windows/desktop/ms687098%28v=vs.85%29.aspx

为了访问桌面,您需要使用该桌面上的线程使用常规的Windows API。 只要桌面不在不同的窗口站,SetThreadDesktop可能是在C中最简单的方法。

不幸的是,这对于一个普通的特权应用程序来说已经很困难了,使用AutoHotkey使得它更加复杂。 由于您无法控制线程或进程初始化,因此您可能必须在另一台桌面上创建一个新进程(可以使用CreateProcess API执行此操作,该进程似乎有一个可用于AHK的包装器,您可以提供桌面名称: http : //www.autohotkey.com/forum/topic1952.html )。 你的过程将需要特殊的权限来做到这一点; 我不确定即使以管理员身份运行也是足够的。