我成功地在服务(本地系统帐户)中使用了SendSAS。我在服务启动后四秒钟调用API。不管启动过程的持续时间如何,Windows设法缓存(某种程度上)调用:相同的代码最终在打开电源后几秒钟在快速膝上型计算机(Win10)上显示一个登录屏幕,并在运行虚拟化(wmware)的慢速服务器(2012R2)上延迟很长时间后向我显示登录屏幕。
我还可以使用CreateProcessAsUser (带有更新的令牌)在会话1、Station、Desktop中注入一个微小的可执行文件。然后,这个过程使用SendInput“自动登录”会话(是的,这是一个可怕的想法,我知道)。
我的问题是:如果这个微小的过程“太早”就开始了,什么都不会发生。如果服务等待,比如说,2分钟,一切都没问题。
我应该使用什么API (在服务中或在已启动的进程中)来了解WinLogon桌面何时准备好接受键盘输入?
我尝试了WTSGetActiveConsoleSessionId (在服务中)和OpenInputDesktop (在这个过程中)跳过这个失败表示需要等待,但是没有结果。
发布于 2017-11-06 15:32:09
当您的流程在附加到WinSta0\Winlogon桌面的会话1中开始时,您可以定期测试当前IUIAutomationElement聚焦元素的Control Type。
要使用的API是:IUIAutomation::GetFocusedElement,然后是IUIAutomationElement:GetCurrentPropertyValue,用于UIA_ControlTypePropertyId属性。当您成功地获得UIA_EditControlTypeId类型的焦点元素时,Windows屏幕就可以接受输入。
不要忘记在每次尝试之间添加一个Sleep调用。
使用Windows 2008R2和2012R2以及Windows 10测试确定。
https://stackoverflow.com/questions/46978053
复制相似问题