我在Windows启动时将标准的非交互式Windows服务设置为“自动启动”(不延迟)。我没有使用任何加载顺序/加载组设置或指定任何依赖项,因此仅是简单的原始服务即可。服务启动时,我调用CreateProcessAsUser来启动另一个软件应用程序。该应用程序仅显示托盘图标和UI窗口,仅此而已。桌面,窗口站,环境块和用户令牌与交互式登录的用户匹配,因此在手动启动服务时,这对于我来说是正确的(而不是重新启动并让服务执行此操作,因为它已设置为自动启动)。现在,问题...
当Windows自动启动服务时,并非总是创建(或显示)正在创建的第二个应用程序的托盘图标。如果我在单独的线程中插入几秒钟的睡眠延迟,然后创建该进程,则所有工作都可以100%正常进行。
这使我相信只有一件事,调用CreateProcessAsUser的代码只是被太早调用。那么,如何确定Desktop或Shell完全初始化的时间,这样才能避免此问题?
在创建过程之前,令牌,环境块,会话ID均正确且经过验证。任何相关的Win32 API都不会失败,因此您会认为,如果我要从交互式用户构建环境,那么外壳就可以了吗?但是,事实并非如此。有什么方法可以确定Shell是否从服务中初始化?我什至都在等待WTS_SESSION_LOGON,同样的问题