如何在使用其他 Windows 资源管理器 shell 启动后启动该 shell?

如何在使用其他 Windows 资源管理器 shell 启动后启动该 shell?

以下是一个 hack,但是对于我所需要的来说它很好。

我创建了一个 C# 程序,显示一些 EULA 文本并有一个同意和不同意按钮。

我设置了HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell启动该程序。

当计算机启动时,会显示正常的登录提示。

登录后,自定义 EULA 程序启动。

没有资源管理器外壳、没有开始菜单、没有背景等(这正是我想要的)。

不同意按钮可以关闭电脑并且正常工作。

我希望“同意”按钮可以加载正常的 Windows 资源管理器外壳(开始菜单、背景等)。

我使用了以下 C# 命令:Process.Start("explorer.exe");

但是这会启动资源管理器窗口,而不是 shell。我希望启动 shell。

我错过了什么?

答案1

在 Windows10 中,要重新启动 Explorer 桌面,您必须将 Shell 注册表项设置为“explorer.exe”并终止进程“sihost.exe”或重新启动新的“sihost.exe”进程。

答案2

我做的和你做的一模一样,下面是我启动 Explorer 的方法

Process explorer = new Process();
explorer.StartInfo.FileName =
    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "explorer.exe");
if (explorer.Start() == false)
{
    MessageBox.Show("Explorer failed to start.");
}
else
{

    //(Snip) some other code that is not relevant.

    explorer.WaitForExit();
}

//(Snip) some cleanup code I run after the user logs off.

并且运行良好。

现在我在 RDP 会话中执行此操作此组策略Computer Configuration\Administrative Templates\Windows Components\Remote Desktop Services\Remote Desktop Session Host\Remote Session Environment\Start a program on connection)不是通过您正在使用的注册表文件,所以也许这就是它对我有用而对您无用的原因。

我可能做的另一件事是,我还调用explorer.WaitForExit();我的代码并等待资源管理器自行关闭,然后再关闭我的应用程序。

尝试使用我启动资源管理器的方式,看看它是否适合您。

答案3

Explorer 必须满足一些条件才能以 shell 形式启动:

  1. Explorer 不能运行(例如,包括控制面板)
  2. Explorer 必须将其视为实际的 shell - 因此您需要在启动 explorer.exe 之前替换该值(可以在几秒钟后将其改回)
  3. 有时似乎(在较新的 Windows 版本上)它取决于启动 explorer.exe 的进程 - 如果 explorer.exe“已知”它 - 我没有关于这部分的更多详细信息(不幸的是,你无法更改它)

从你的问题来看,你至少缺少了第 2 部分。

答案4

当我按照有关如何安装自定义 Shell 的说明进行操作时,我遇到了以下情况:通过安装和使用 Microsoft 的 Shell Launcher,我首先会看到我的自定义 Shell 出现(没有任务栏等),但是当我启动 Windows 资源管理器时,它会显示任务栏。请参阅:https://docs.microsoft.com/en-us/windows-hardware/customize/enterprise/shell-launcher

相关内容