如何知道 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.
上测试正常
我在服务(本地系统帐户)中成功使用了 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.
上测试正常