Windows启动C#的奇怪行为

时间:2010-05-25 19:37:44

标签: c# windows startup

我已经创建了一个应用程序,可以选择在Windows启动时启动。 首先,我通过注册表执行此操作,如下所示:

private void RunOnStartup(bool RunOnStartup) {
    Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
    if (RunOnStartup) {
        key.SetValue(ProgramTitle, System.Windows.Forms.Application.ExecutablePath.ToString());
    } else {
        key.DeleteValue(ProgramTitle, false);
    }
}

这有效,但不正确。它启动了.exe,但行为与它需要的默认“config.xml”的新行为相同。这显然是错误的。

我无法找出问题所在,所以我尝试了不同的方法:在Startup文件夹中创建一个快捷方式。我想是不可能出错,我的意思是,这只是一条捷径?

我使用了这段代码:

private void RunOnStartup(bool RunOnStartup) {
    string startup = Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\"+ProgramTitle+".url";
    if (RunOnStartup) {
        using (StreamWriter writer = new StreamWriter(startup)) {
            string app = System.Reflection.Assembly.GetExecutingAssembly().Location;
            writer.WriteLine("[InternetShortcut]");
            writer.WriteLine("URL=file:///" + app);
            writer.WriteLine("IconIndex=0");
            string icon = app.Replace('\\', '/');
            writer.WriteLine("IconFile=" + icon);
            writer.Flush();
        }
    } else {
        if (File.Exists(startup)) {
            File.Delete(startup);
        }
    }
}

这也很有效,它开始了,但行为相同。

所以我的问题是,有没有人知道这是怎么发生的?非常感谢任何帮助!

由于

2 个答案:

答案 0 :(得分:2)

我怀疑你的应用程序是使用与可执行文件所在目录不同的工作目录启动的(通过查看我自己的进程列表,他们将用户的配置文件作为其工作目录),这就是你的config.xml的原因找不到。但是,我有快捷方式的应用程序(真正的快捷方式,即.lnk文件,而不是Internet快捷方式,即.url文件,就像您尝试的那样)将其工作目录设置为快捷方式中指定的目录。

要轻松创建shell链接(.lnk),您可以尝试使用shell32.dll公开的COM接口和类,特别是ShellLinkObject和ShellLinkObjectClass。确保正确设置WorkingDirectory属性!

或者,更改程序,使其在启动时根据可执行路径更改其工作目录。

答案 1 :(得分:0)

非常感谢FrancisGagné!

我设法创建了一个有效的.lnk,现在一切正常:)

代码:

public static void CreateShortcut(string Filename, string InkLocation, string Description) {
            string TargetDirectory = "";
            string[] splitted = Filename.Split('\\');
            for (int i = 0; i < splitted.Length - 1; i++) {
                TargetDirectory += "\\" + splitted[i];
            }
            TargetDirectory = TargetDirectory.Substring(1);
            WshShellClass wsh_Shell = new WshShellClass();
            IWshShortcut myshorcut = wsh_Shell.CreateShortcut(InkLocation) as IWshShortcut;
            myshorcut.TargetPath = Filename;
            myshorcut.Description = Description;
            myshorcut.WorkingDirectory = TargetDirectory;
            myshorcut.Save();
        }