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

标签 c++ windows winapi service winlogon

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

我还可以使用CreateProcessAsUser (使用更新的 token )在 session 1、Station WinSta0、Desktop Winlogon 中注入(inject)一个小型可执行文件。然后该进程使用 SendInput “自动登录” session (是的,这是一个糟糕的想法,我知道这一点)。

我的问题:如果这个微小的过程“太早”开始,那么什么也不会发生。如果服务等待(例如 2 分钟),则一切正常。

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

我试过WTSGetActiveConsoleSessionId (在服务中)和OpenInputDesktop (在此过程中)希望失败将表明需要等待,但无济于事。

最佳答案

当您的进程在附加到 WinSta0\Winlogon 桌面的 session 1 中启动时,您可以定期测试当前 IUIAutomationElement控件类型 > 焦点元素。

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

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

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

关于c++ - 如何知道 Winlogon 桌面何时准备好输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46978053/

相关文章:

c++ - 与 C++ 2011 不相关的并行随机种子?

c++ - 是否可以从 ELF Core 文件中删除堆?

python - Healpy 在 Windows 上安装 Python 3.4

c++ - exe导入dll序号与DLL导出函数名比较?

c# - 从 C# 向 VMWare 发送键盘输入

c++ - 如何停止正在阻塞的 win32 线程?

用户定义类型的 getter 和 setter 上的 C++(类 CAS)同步

c++ - 使用 union 作为 boost::asio 的序列化器

c++ - 是否有任何 Win32 API 可以触发 Windows 中的休眠或挂起模式?

windows - Windows 事件是顺序处理还是并行处理?