2010-05-25 3 views
0

Я создал приложение с возможностью запуска при запуске Windows. Сначала я сделал это через реестр, как это:Странное поведение при запуске Windows C#

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», в котором он нуждается. Это, очевидно, неправильно.

Мне не удалось выяснить, что случилось, поэтому я попробовал это по-другому: создайте ярлык в папке автозагрузки. Не могу пойти не так, как я понял, я имею в виду, что это просто ярлык?

Я использовал этот код:

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

И это работало, как хорошо, это началось, но с тем же поведением.

Так что мой вопрос: кто-нибудь знает, как это происходит? Любая помощь высоко ценится!

Благодаря

+0

«Он начал EXE-файл, но с таким же поведением, как это был новый один с по умолчанию «config.xml» он нуждается. Это, очевидно, неправильно ». Это совсем не очевидно, поскольку мы не знаем, что должно делать ваше приложение и что влияет на различные файлы config.xml, которые должны быть на нем. –

+0

Единственное, что он делает, - это прочитать XML-файл для его значений, ничего другого кроме этого, так что не думайте, что это может помешать. – FrieK

ответ

2

Я подозреваю, ваше приложение запускаются с рабочим каталогом, отличным от каталога исполняемого файла в (посмотрев на моем собственном список процессов, они имеют профиль пользователя, как их рабочий каталог), и это почему ваш config.xml не найден. Тем не менее, приложения, для которых у меня есть ярлыки (реальные ярлыки, то есть файлы .lnk, а не ярлыки Интернета, т. Е. Файлы .url, например, то, что вы пытались сделать), имеют свой рабочий каталог в каталоге, указанном в ярлыке.

Чтобы создать ссылку на оболочку (.lnk) легко, вы можете попробовать использовать COM-интерфейсы и классы, открытые shell32.dll, в частности ShellLinkObject и ShellLinkObjectClass. Не забудьте правильно установить свойство WorkDirectory!

В качестве альтернативы, измените программу, чтобы изменить ее рабочий каталог при запуске на основе исполняемого пути.

+0

Спасибо за ответ, я пытался создать файлы чернил, но с каждым примером я нахожу, что он дает ошибки. Когда я вручную создаю файл Ink (пустой), а затем запускаю код, он не дает никаких ошибок, но чернила также не заполняются данными. Но что именно вы имеете в виду, если WorkDir отличается от ExecutedPath? Как это может быть иначе? – FrieK

0

Большое спасибо Francis Gagné!

Я сумел создать рабочую .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(); 
     }