Прочитав все комментарии к этой теме и посту в блоге johnnycoder, упомянутому выше , я нашел решение, которое:
- Добавляет приложение ClickOnce в папку «Автозагрузка»
- Удаляет элемент автозагрузки автоматически при удалении приложения ClickOnce (после перезагрузки или выхода из системы / входа в систему)
- Был протестирован и работает на Windows XP, Windows 7, Windows Server 2000/2003, Windows 8
Мое решение
По сути, ваше приложение будет записывать файл .bat
в папку «Автозагрузка», которая запускает приложение ClickOnce для вас. Файл .bat
достаточно умен, чтобы определить, было ли приложение деинсталлировано, и удалит себя, если приложение ClickOnce не будет найдено.
Шаг 1
Получите рабочий пакетный файл. Замените PUBLISHER_NAME и APPLICATION_NAME правильными значениями. Вы можете найти их, установив приложение ClickOnce, а затем следуя по пути к нему в файловой системе:
@echo off
IF EXIST "%appdata%\Microsoft\Windows\Start Menu\Programs\PUBLISHER_NAME\APPLICATION_NAME.appref-ms" (
"%appdata%\Microsoft\Windows\Start Menu\Programs\PUBLISHER_NAME\APPLICATION_NAME.appref-ms"
) ELSE (start /b "" cmd /c del "%~f0"&exit /b)
Пакетный файл проверит, установлено ли ваше приложение ClickOnce (просмотрев, существует ли файл appref-ms), и запустит его, если так. В противном случае пакетный файл удаляется сам с помощью метода , обозначенного здесь .
Теперь, когда у вас есть пакетный файл, протестируйте его. Поместите его в папку «Автозагрузка», чтобы убедиться, что оно запускает ваше приложение при входе в систему.
Шаг 2
Теперь в коде вашего приложения вам нужно записать этот пакетный файл в папку «Автозагрузка». Вот пример использования командного файла выше в C # (обратите внимание, что существует некоторое экранирование и происходит переменная окружения voodoo):
string[] mystrings = new string[] { @"@echo off
IF EXIST ""%appdata%\Microsoft\Windows\Start Menu\Programs\PUBLISHER_NAME\APPLICATION_NAME.appref-ms"" (
""%appdata%\Microsoft\Windows\Start Menu\Programs\PUBLISHER_NAME\APPLICATION_NAME.appref-ms""
) ELSE (start /b """" cmd /c del ""%~f0""&exit /b)"};
string fullPath = "%appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\StartMyClickOnceApp.bat";
//Expands the %appdata% path and writes the file to the Startup folder
System.IO.File.WriteAllLines(Environment.ExpandEnvironmentVariables(fullPath), mystrings);
Вот так. Комментарии / улучшения приветствуются.
РЕДАКТИРОВАТЬ: исправлены кавычки в шаге 2