某些安装应用程序会停止(或似乎停止)正常的 Windows 启动。计算机启动,用户登录,然后安装程序先于其他程序(例如 Windows 资源管理器)启动。
我如何在自己的程序中复制这种行为?
例如
如果要在 shell 启动之前启动应用程序,可以向注册表中的
Userinit
值添加一个值。在这个键中:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
有一个名为
Userinit
的值。更改它,以便您的程序在 userinit.exe 之前运行。例如,要在 shell/其他所有内容初始化之前启动记事本:
C:\WINDOWS\system32 otepad.exe,C:\Windows\system32\userinit.exe
使用逗号分隔应启动的程序。
这适用于 Windows XP、Vista 和 7。
我没有尝试过,但我认为这是由注册表项完成的
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup
还有更多的注册表项 - 请参阅此处记录的完整列表: 注册表中 RunOnce 键的定义
但对于您的用例,我建议您将应用程序作为桌面 shell 启动,类似于“vcsjones”建议的解决方案。当您的程序完成后,您可以调用
explorer.exe
开始加载常规桌面。
您应该查看 Windows 任务计划程序。可以安排任务在用户(特定或任何)登录时执行。 Windows 提供的开箱即用的 UI 说明了使用此标准 Windows 功能实际上可以做什么。
另一个解决方案是编写一个 Windows 服务(.msi Windows Installer 实际上是一个服务)。
我不确定您是否能够阻止 Windows 资源管理器...
您可以将 Windows 批处理文件
.bat
包装在 explorer.exe
周围
@echo off
something.exe
explorer.exe
但这并不能真正确保它总是在 explorer.exe 之前启动
您可以更改某些注册表值来选择另一个“shell”而不是资源管理器。 .
如果这就是您真正想要的。
https://github.com/sylveon/EarlyStart
打开会话时在 Windows 资源管理器之前启动程序。