启动程序卡住了Windows加载

时间:2013-07-29 07:38:14

标签: c# registry startup app-startup

我已经创建了一个需要在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);
  }

}

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

如果您想要更复杂的解决方案,请查看此处:C# - How to know when Windows is "settled" after startup?

答案 1 :(得分:0)

关于RunOnce的内容是真实的,解决方案是简单地删除对该注册表项的添加。在我删除它并仅在“运行”键中离开路径后,它被修复了。