以下是一个 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 形式启动:
- Explorer 不能运行(例如,包括控制面板)
- Explorer 必须将其视为实际的 shell - 因此您需要在启动 explorer.exe 之前替换该值(可以在几秒钟后将其改回)
- 有时似乎(在较新的 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