【问题标题】:Startup program stuck windows loading启动程序卡住窗口加载
【发布时间】:2013-07-29 07:38:14
【问题描述】:

我制作了一个应用程序,它需要在 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);
  }

}

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

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

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

【问题讨论】:

  • 为什么要将它添加到两个启动键中?这不会导致它第一次启动两次吗?另外,为什么首先将它添加到 RunOnce 中?这应该只用于应该只运行一次的东西(启动后从该键中删除条目)。另外,既然您将您的价值命名为“服务”,为什么不注册一个 Windows 服务呢?这可以配置为延迟启动。
  • 我将它添加到这两个地方,因为当我尝试搜索如何使程序在启动时运行时,每个地方都命名这两个地方来插入路径......所以实际上应该做什么?
  • 如果您真的想启动用户可以使用的应用程序(例如托盘图标),请使用 Matthew Watson 提供的解决方案。如果您的程序应该在没有任何用户交互的情况下在后台运行,您应该创建一个真正的 Windows 服务。

标签: c# registry startup app-startup


【解决方案1】:

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

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

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

【讨论】:

  • 对于那些阅读它的人来说,关于 runOnce 的部分是正确的,但问题是通过简单地不写入该注册表位置来解决的......而不是通过添加线程睡眠
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多