如何知道 Winlogon 桌面何时准备好输入?

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

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

我也可以使用 CreateProcessAsUser (with an updated token) to inject a tiny executable in the Session 1, Station WinSta0, Desktop Winlogon. The process then uses SendInput 到 "auto-logon" 会话(是的,这是一个糟糕的想法,我知道这一点)。

我的问题:如果小进程启动 "too early",什么也不会发生。如果服务等待 2 分钟,则一切正常。

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

我试过 WTSGetActiveConsoleSessionId (in the service) and OpenInputDesktop(在此过程中)希望失败表明需要等待,但没有用。

当您的进程在会话 1 中启动时,附加到 WinSta0\Winlogon 桌面,您可以定期测试当前 IUIAutomationElement 焦点元素的 Control Type

要使用的 API 是:IUIAutomation::GetFocusedElement and then IUIAutomationElement::GetCurrentPropertyValue 用于 UIA_ControlTypePropertyId 属性。当您成功获得 UIA_EditControlTypeId 类型的焦点元素时,Windows 登录屏幕已准备好接受输入。

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

在 Windows Server 2008R2 和 2012R2 以及 Windows 10.

上测试正常