窗户锁定屏幕后面会发生什么?

Pla*_*chs 21 windows winapi autohotkey

我一直致力于Windows自动化和监控.

当我锁定Windows机器的屏幕时到底发生了什么?

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

有人可以对这一切有所了解,或者指出一个可读的来源,我可以对这个主题进行概述吗?

Bre*_*McK 31

基本上会发生什么是Windows切换到安全桌面,使其成为当前的桌面,因此输入现在与它相关联.

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

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

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

简而言之,UI仍然存在:您可以对其进行某些查询,但您不能再像通过发送输入那样在常规桌面上自动执行它,并且与焦点或输入相关的一些其他功能可能会失败.

我对AutoHotKey并不是很熟悉,但功能的名称和描述表明它严重依赖于底层的Win32 SendInput API.当桌面处于非活动状态时,这对于键盘输入完全不起作用.

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

我过去遇到的桌面和自动化问题是:如何使用某种形式的用户输入自动化(鼠标,键盘模拟)进行长时间运行的测试,但仍然锁定我的PC以便有人可以只是走过去干扰它.锁定PC后,桌面处于非活动状态,因此自动停止工作.如果屏幕保护程序启动,则会发生类似的问题:桌面交换机,自动化失败.

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