确定 explorer.exe 是否作为 Windows shell 运行?
-
05-09-2019 - |
题
我需要确保 explorer.exe
作为系统 shell 运行。我需要做的是:
- 覆盖当前 shell (
Winlogon\Shell
) 和explorer.exe
- 跑步
explorer.exe
(作为外壳) - 用我自己的 shell 覆盖当前的 shell。
最后两步之间是一场比赛:
- 如果我太快地用自己的 shell 覆盖当前 shell,则只会打开“我的文档”窗口。
所以问题是,我是否可以调用任何事件/互斥体/回调来确保资源管理器初始化为 shell?
我能做的最好的事情就是等待托盘窗口,例如:
while(!FindWindow("Shell_TrayWnd", NULL)) {
sleep(250);
}
这看起来有点草率,有更好的方法吗?
解决方案
我什至不会尝试这样做。您应该创建一个新的 winsta0 桌面 (Win32 API CreateDesktop),在该桌面上启动 Kiosk 应用程序并切换到它。这样,您就可以保留默认桌面,运行资源管理器,并且可以在需要时返回到它。我们在自己构建的自助服务终端项目中取得了巨大成功。
其他提示
更好的方法(如实际记录的那样)是创建一个顶级窗口并等待“TaskbarCreated”广播。这样你也可以摆脱 Sleep() 调用。
广播已记录 这里.
你为什么不观察正在运行的进程呢?在步骤 1 之前,不应列出 explorer.exe,因为它不是默认 shell。第 2 步,启动它并观察该过程,一旦可用,您就可以进行更改。
我不确定您是否使用 .NET 框架,但如果您使用 StartInfo 类上的事件应该足以满足您的需求。
不隶属于 StackOverflow