如何知道Winlogon桌面何时可以输入

How to know when the Winlogon desktop is ready for inputs?

本文关键字:输入 何时可 桌面 何知道 Winlogon      更新时间:2023-10-16

我成功地在服务(本地系统帐户)中使用了SendSAS。我在服务启动四秒钟后调用API。似乎无论引导过程的持续时间如何,Windows都能缓存(某种程度上)调用:在快速笔记本电脑(Win10)上,相同的代码最终在开机几秒钟后向我显示登录屏幕,并在运行虚拟化(wmware)的慢速服务器(2012R2)上显示更长延迟后的登录屏幕。

我还可以使用CreateProcessAsUser(带有更新的令牌)在会话1、Station WinSta0、Desktop Winlogon中注入一个微小的可执行文件。然后,该过程使用SendInput来"自动登录"会话(是的,我知道这是一个糟糕的想法)。

我的问题是:如果这个微小的过程开始得"太早",什么都不会发生。如果服务等待,例如2分钟,则一切正常

我应该使用什么API(在服务或启动过程中)来确定WinLogon桌面何时准备好接受键盘输入?

我尝试了WTSGetActiveConsoleSessionId(在服务中)和OpenInputDesktop(在过程中),但失败表明需要等待,但没有成功。

当您的进程在连接到WinSta0Winlogon桌面的会话1中启动时,您可以定期测试当前关注IUIAutomationElement的元素的Control Type

要使用的API是:IUIAutomation::GetFocusedElement,然后是UIA_ControlTypePropertyId属性的IUIAutomotionElement::GetCurrentPropertyValue。当您成功获得UIA_EditControlTypeId类型的聚焦元素时,Windows登录屏幕就可以接受输入了。

不要忘记在每次尝试之间添加一个Sleep调用。

在Windows Server 2008R2和2012R2以及Windows 10上测试正常。