添加程序到启动注册表文件夹不起作用(C#)

时间:2017-08-24 08:37:40

标签: c# registry startup

我正在尝试使用此代码在启动时运行我的程序

 if (Properties.Settings.Default.runonstartup)
 {
      key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
      key.SetValue("PrintScreenSharp", Application.ExecutablePath.ToString());
      key.Close();
      }
 else
 {
      key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
      key.DeleteValue("PrintScreenSharp");
 }

它添加和删除密钥没有任何问题,但是当我重新启动计算机时程序不运行。如果你检查任务管理器,它列出并启用了我的程序,但它实际上标记为“程序”,奇怪的是。它没有用真名“PrintScreen#”来提及它。

我一直在寻找一些时间,为什么会这样,但我没有运气。

如果你想自己尝试一下这个程序:

http://box.endurehosting.com/contents/public/PrintScreen%23.exe

1 个答案:

答案 0 :(得分:0)

由于问题不明显,而且您提供的代码应该正常工作,我提供的替代方案对您来说可能看起来很丑,但值得一试。您可以创建一个快捷方式并将其放入" Startup"文件夹以便添加它,或删除快捷方式以阻止其启动。

您可以通过执行以下操作来创建快捷方式:

using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;

然后将其包含在课堂之外:

[ComImport]
[Guid("00021401-0000-0000-C000-000000000046")]
internal class ShellLink
{
}
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214F9-0000-0000-C000-000000000046")]
internal interface IShellLink
{
    void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd, int fFlags);
    void GetIDList(out IntPtr ppidl);
    void SetIDList(IntPtr pidl);
    void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
    void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
    void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
    void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
    void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
    void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
    void GetHotkey(out short pwHotkey);
    void SetHotkey(short wHotkey);
    void GetShowCmd(out int piShowCmd);
    void SetShowCmd(int iShowCmd);
    void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cchIconPath, out int piIcon);
    void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
    void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
    void Resolve(IntPtr hwnd, int fFlags);
    void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
}

然后为了使用它,你可以简单地称它:

IShellLink link = (IShellLink)new ShellLink();
link.SetDescription("description here");
link.SetPath(Application.ExecutablePath);

IPersistFile file = (IPersistFile)link;
string StartupFolderPath = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
file.Save(Path.Combine(StartupFolderPath, "NAME OF SHORTCUT.lnk"), false);

您可以使用以下命令获取启动文件夹的字符串路径:

Environment.GetFolderPath(Environment.SpecialFolder.Startup);

这应创建一个快捷方式并将其放入启动文件夹路径中。正如我所说,这不是一个优雅的解决方案,但如果你在添加注册表时找不到问题的根源,这是值得的。

相关问题