【问题标题】:Determining whether explorer.exe runs as a windows shell?确定 explorer.exe 是否作为 Windows shell 运行?
【发布时间】:2023-03-23 22:13:01
【问题描述】:

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

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

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

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

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

我能做的最好的事情就是等待托盘窗口,例如:

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

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

【问题讨论】:

  • 我就是这么做的。它位于 Winlogon\Shell 注册表项中。
  • 为什么以shell运行explorer.exe,以后再替换?
  • 并非如此,我们的软件满足我们的需求。

标签: c winapi windows-shell windows-explorer


【解决方案1】:

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

【讨论】:

  • 恐怕这也行不通,在某些时候我需要应用程序在资源管理器运行后仍可访问。
  • 在您的应用程序中构建使用 SwitchDesktop 在正在运行的桌面之间切换的能力。
  • 我的意思是我需要在“主窗口”上显示我的应用程序的状态窗口。
【解决方案2】:

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

广播记录在here

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • System.ini 不起作用,这是 W95 时代的旧方法。我也不需要第三方解决方案,我在原始帖子中发布的解决方案很好,我只是认为可能有更好的方法......
    【解决方案4】:

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

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

    【讨论】:

    • 这行不通。该进程在生成后立即列出。进程生成和资源管理器准备就绪之间的时间有点长(更不用说完全随机了)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2011-03-09
    • 2011-01-07
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    相关资源
    最近更新 更多