确定explorer.exe是否作为Windows shell运行?

时间:2009-05-25 02:34:50

标签: c winapi windows-shell windows-explorer

我需要确保explorer.exe作为系统shell运行。我需要做的是:

  • 使用Winlogon\Shell
  • 覆盖当前shell(explorer.exe
  • 运行explorer.exe(作为shell)
  • 使用我自己的shell覆盖当前shell。

在最后两个步骤之间是一场比赛:

  • 如果我过快地用自己的shell覆盖当前shell,则只打开“我的文档”窗口。

所以问题是,是否有任何事件/互斥/回调我可以调用以确保将资源管理器初始化为shell?

我设法做的最好的事情是等待托盘窗口,如:

while(!FindWindow("Shell_TrayWnd", NULL)) { 
     sleep(250);
}

这似乎有点草率,有更好的方法吗?

4 个答案:

答案 0 :(得分:6)

我甚至不会尝试这样做。您应该创建一个新的winsta0桌面(Win32 API CreateDesktop),在该桌面上启动Kiosk应用程序并切换到它。这样您就可以单独保留默认桌面,运行资源管理器,如果需要,可以返回它。在我们建立的自助服务亭项目中,我们取得了很大的成功。

答案 1 :(得分:3)

更好的方法(如实际记录的那样)是创建顶级窗口并等待“TaskbarCreated”广播。这样你也可以摆脱Sleep()调用。

广播记录为here

答案 2 :(得分:0)

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

您是否尝试过简单地在system.ini中设置shell,如litestep和其他桌面替换软件?如果您必须来回切换,请考虑为此任务编写的ShellOnLiteSpawn等shell切换器。

答案 3 :(得分:-1)

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

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