2017-08-24 41 views
0

我試圖用這個代碼在啓動時添加程序到啓動註冊表文件夾不工作(C#)

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

+0

由於運行團隊在一切準備就緒之前有可能踢進任何可能失敗的機會?從您的應用程序中查看任何日誌文件? – BugFinder

+0

我不這麼認爲,我查過了事件日誌,看不到我的程序。我覺得我應該提及我運行的窗口的副本是5小時前安裝的。就像它可以得到的股票一樣。 – Syllith

+0

你有沒有考慮過把它放在計劃任務下的登錄時運行?也有你試過一個虛擬的應用程序,幾乎沒有什麼,只是說寫臨時文件說「我做了這個」,以確認它正在工作 - 我想它的踢在桌面真的可用之前 – BugFinder

回答

0

既然問題是不可見的,您所提供的代碼應該沒事的工作,我準備了替代其外觀可能對你很醜,但它值得一試。您可以創建快捷方式並將其放入「啓動」文件夾中以添加它,或者刪除快捷方式以阻止其啓動。

您可以通過執行實現快捷的創建:

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); 

這應該創建一個快捷方式並將其放入啓動文件夾路徑中。正如我所說,這不是一個優雅的解決方案,但如果在添加註冊表時找不到問題的根源,這是值得的。