Windows锁屏界面背后发生了什么?

23

我一直在从事 Windows 自动化和监控的工作。

当我锁定 Windows 机器的屏幕时,实际上会发生什么?

目前我正在使用 Windows 7,如果我切换到 Vista 或服务器版本,行为上是否有很大差异?是否仍然存在可以通过 API 访问的桌面? 我知道我仍然可以向特定窗口发送键盘击键和鼠标点击(通过 ControlSendControlClick),但似乎没有 "桌面" 本身。

能否有人解释一下这整个问题,或者指点我一个可读性强的来源,在那里我可以获得关于该主题的概述?

2个回答

33
基本上发生的是Windows切换到安全桌面,将其设置为当前桌面,因此输入现在与之关联。
旧桌面仍然存在:所有桌面上的HWND仍然存在,任何附加到该桌面的线程仍然可以访问这些HWND,获取它们的位置等。您仍然可以向此桌面上的窗口发送消息,只要发送消息的线程也在该桌面上。
但是,由于桌面现在处于非活动状态,因此无法接收输入。 GetForegroundWindow将返回NULL(如果我没记错的话),并且您不能再使用SendInput,因为输入现在属于[不同桌面上的]线程;该非活动桌面上的任何控件都无法获得焦点。
请注意,向没有焦点的控件发送按键消息有时可能会导致意外行为,因为应用程序或控件通常从未预期在未先获得焦点的情况下接收键盘输入。 (对于在WM_SETFOCUS中设置某种输入上下文并在WM_KILLFOCUS中清除它的控件,这可能会带来问题,例如。)
简而言之,UI仍然存在:您可以执行某些查询操作,但是您无法像在常规桌面上发送输入那样自动化它,并且与焦点或输入相关的某些其他功能可能会失败。
我对AutoHotKey不是特别熟悉,但其功能的名称和描述表明它严重依赖于底层的Win32 SendInput API。当桌面处于非活动状态时,这在键盘输入方面根本无法工作。
关于桌面如何工作以及与winstations、锁定的桌面等的关系的合理概述,请查看MSDN上的桌面文章
过去我遇到过一个问题,即如何离开一个长时间运行的测试,该测试使用某种形式的用户输入自动化(鼠标、键盘模拟),但仍然锁定我的PC,以防止有人走近并干扰它。一旦你锁定了PC,桌面就处于非活动状态,因此自动化停止工作。如果屏幕保护程序启动,会出现类似的问题:桌面会切换,自动化失败。
一种解决方案是使用两台计算机:我们称它们为主机和测试机。从主机上,打开一个远程终端服务客户端到测试机上,然后从主机上的终端服务客户端窗口上,在测试机上运行自动化测试。现在很酷的部分来了:您可以最小化该TSC窗口,甚至锁定主机(或让屏幕保护程序启动),而该虚拟会话将继续工作,认为它仍处于活动状态 - 只是没有人关注它。这是创建具有活动桌面但没有人能干扰的“连接”会话的一种方式,因为它受到主机锁定桌面的保护。

1
@echristopherson 这是我最终决定采用的方案。使用虚拟机来运行系统,并使用VNC服务器保持“视图”开放。我可以将机器锁定以防止一般访问,并将VNC关闭以避免外部访问,这样只有在autohotkey仍然能够在机器上工作时,我才能进入它。 - Plastefuchs

2

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

为了访问一个桌面,你需要使用来自在那个桌面上的线程的常规Windows API。在C语言中,SetThreadDesktop可能是最简单的方法,只要桌面不在另一个窗口工作站上。

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


哦,那个AHK论坛上的东西实际上是一个独立的C++程序。直接调用CreateProcess可能会更容易。在STARTUPINFO结构中寻找lpDesktop。 - Esme Povirk
谢谢你的回答。看起来通过API的方式会让我需要做的事情变得更加复杂。我想我会选择“如果不引入5000个bug,就不可能实现”。 :) - Plastefuchs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接