0

我制作了一个需要在 Windows 启动时运行某个进程的应用程序。我创建了一个方法,它通过接收程序的路径并将其添加到注册表来完成。这是方法:

private void AddPathToStartUpPrograms(string path)
{
  string startUpPosition1 = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
  string startUpPosition2 = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce";
  RegistryKey k = Registry.LocalMachine.OpenSubKey(startUpPosition1, true);
  if (k != null)
  {
    k.SetValue("service", path);
  }
  k = Registry.LocalMachine.OpenSubKey(startUpPosition2, true);
  if (k != null)
  {
    k.SetValue("service", path);
  }

}

此代码正在运行,但问题是我添加的进程似乎使桌面加载卡住了。加载桌面时,它会加载背景墙纸,但不会加载图标。我可以进入任务管理器,当我关闭添加到启动程序的进程时,桌面“解冻”并完成加载所有内容。

奇怪的是,即使我关闭了进程,在桌面完成加载后,我的进程再次运行,然后一切正常,这意味着它出于某种原因运行了两次。

所以我的问题是如何将进程设置为仅在桌面完成加载后运行?

4

2 回答 2

1

它运行两次,因为您在Run和中都设置了注册表项RunOnce。如果您希望它每次都运行,只需将其设置在Run密钥中即可。RunOnce关键仅适用于您希望(顾名思义)只运行一次的程序。RunOnce操作系统启动后,注册表项会自动删除。

如果你想延迟程序直到 shell 启动,最简单的方法(虽然有点 hacky)就是Thread.Sleep(60000)在程序的最开始放一个 a 。

如果您想要更复杂的解决方案,请查看此处:C# - 如何知道 Windows 启动后何时“稳定”?

于 2013-07-29T07:44:53.290 回答
0

关于 RunOnce 的说法是正确的,解决方案是简单地删除对该注册表项的添加。在我将其删除并仅将路径留在“运行”键中后,它已修复。

于 2013-07-29T08:42:48.677 回答