我需要确保 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() 调用。

广播已记录 这里.

您还没有解释为什么需要 3 个步骤,“信息亭软件”不是解释。

您是否尝试过像 litestep 和其他桌面替换软件一样简单地在 system.ini 中设置 shell?如果您必须来回切换,请考虑使用 shell 切换器,例如 壳牌 或者 LiteSpawn 是为此任务而编写的。

你为什么不观察正在运行的进程呢?在步骤 1 之前,不应列出 explorer.exe,因为它不是默认 shell。第 2 步,启动它并观察该过程,一旦可用,您就可以进行更改。

我不确定您是否使用 .NET 框架,但如果您使用 StartInfo 类上的事件应该足以满足您的需求。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top