Подтвердить что ты не робот

Как я могу запустить развернутое приложение для запуска при запуске при запуске?

Как я могу запустить приложение с включенным кликом, запустить запуск?

Лучший вариант, который я нашел путем поиска, - установить Publisher в приложении в Startup, поэтому ярлык меню "Пуск" будет помещен в папку "Автозагрузка", но это кажется огромным взломом, и я хотел бы, чтобы там был "Пуск" значок меню, который люди могут найти.

Какие у меня есть варианты?

4b9b3361

Ответ 1

Я чувствую, что добавление приложения в папку автозагрузки непрофессионально. Я настоятельно рекомендую использовать ключ реестра для запуска приложения.

В отличие от того, что говорится в материале по этой теме, очень просто настроить ключ для запуска приложения с одним щелчком мыши и не требует установки дополнительных ярлыков. Вы просто используете ярлык, созданный при установке:

// The path to the key where Windows looks for startup applications
RegistryKey rkApp = Registry.CurrentUser.OpenSubKey(
                    @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);

//Path to launch shortcut
string startPath = Environment.GetFolderPath(Environment.SpecialFolder.Programs) 
                   + @"\YourPublisher\YourSuite\YourProduct.appref-ms";

rkApp.SetValue("YourProduct", startPath);

Ответ 2

Прочитав все комментарии по этой теме и сообщение в блоге 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

Теперь, в коде для вашего приложения, вам нужно записать этот командный файл в папку "Автозагрузка". Вот пример использования командного файла выше в С# (обратите внимание, что происходит некоторое экранирование, а также переменная среды 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);

Там у вас есть. Комментарии/улучшения приветствовались.

EDIT: Исправлены кавычки на шаге 2

Ответ 3

Все эти трюки, к сожалению, не работают на Vista. Vista по какой-то причине блокирует эти программы при запуске.

Как было предложено @thijs, вы можете легко обойти "безопасность" Vista на этом. См. Blogpost на как запускать приложения clickonce при запуске Windows.

Ответ 4

Ну, есть несколько способов сделать запуск вашего приложения при запуске, но есть проблема с очисткой. Даже если вы используете начальный раздел реестра, и он выглядит нормально, в любом случае вы должны очистить все, что вы добавили в систему. Вы можете взглянуть на мою статью, я столкнулся с такой же проблемой очистки и использовал файл для удаления и удаления автоматизации для решения проблемы.

Ответ 5

Спасибо DiscDev и dbenham. Решение отлично работает. Просто хотел поделиться обновленным рабочим кодом на основе последних dbenham.

 const string fullPathEnvVar =
            "%appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\StartMyClickOnceApp.bat";
 //Expands the %appdata% path
 string fullPath = Environment.ExpandEnvironmentVariables(fullPathEnvVar);

if (!File.Exists(fullPath))
        {
            string[] mystrings =
            {
                @"@echo off 
if exist ""%appdata%\Microsoft\Windows\Start Menu\Programs\<PublisherName>\<ApplicationName>.appref-ms"" (
""%appdata%\Microsoft\Windows\Start Menu\Programs\<PublisherName>\<ApplicationName>.appref-ms""
) else (
(goto) 2>nul & del ""%~f0""
)"
            };
            //write the file to the Startup folder
            File.WriteAllLines(fullPath, mystrings);
        }

Ответ 6

Прежде всего спасибо за ответ Discdev. Чтобы заставить это работать с Å Ö и другими специальными символами, эта модификация сделала это для меня, используя UTF-8 на другой кодовой странице и без спецификации.

string[] mystrings = new string[] { "chcp 65001", @"IF EXIST ""%appdata%\Microsoft\Windows\Start Menu\Programs\<Publisher>\<App_Name>.appref-ms"" (""%appdata%\Microsoft\Windows\Start Menu\Programs\<Publisher>\<App_Name>.appref-ms"") ELSE (start /b """" cmd /c del ""%~f0""&exit /b)" };
string fullPath = "%appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\StartErrandDynamicMenu.bat";
System.Text.Encoding utf8WithoutBOM = new System.Text.UTF8Encoding(false);
System.IO.File.WriteAllLines(Environment.ExpandEnvironmentVariables(fullPath), mystrings, utf8WithoutBOM);

Ответ 7

С точки зрения фактического запуска приложения при запуске, наличие ссылки в папке автозагрузки - лучший выбор. Или если не папка автозагрузки, то ключ автозагрузки.

Способ обойти, не имея значка в его нормальной позиции, - это приложить приложение к себе в папку автозагрузки при запуске приложения. Приложения ClickOnce будут запускаться при первом запуске. Приложение может использовать этот запуск для размещения ссылки в папке автозагрузки. Теперь ссылка будет в обоих местах, и вы должны быть золотыми.

Проблема заключается в том, что теперь удаление приложения ClickOnce больше не будет удалять его. ClickOnce не будет отслеживать добавленную ручную ссылку и, следовательно, каждый раз, когда кто-то удаляет ваше приложение и перезагружается, он будет переустанавливаться. Я бы начал рассматривать эту программу, чтобы не вести себя хорошо:(.

Ответ 8

Вы можете добавить свое приложение в соответствующий раздел реестра "Запустить" при запуске. Тогда даже если вы не сможете удалить его, когда ваше приложение будет удалено, это ничего не повредит, и никто не увидит сломанную ссылку.

Ответ 9

В случае, если это поможет кому-то еще, ищущему решение этого вопроса, комментарий внизу http://johnnycoder.com/blog/2009/02/24/clickonce-run-at-startup/ предлагает установить параметры публикации ClickOnce ( в VS.Net 2010, что в свойствах проекта, экран публикации и параметры) с именем издателя, установленным для запуска, а имя пакета оставлено пустым. Это делает ярлык программы в папку автозагрузки для меня в Windows 7. Я не знаю, что делают другие версии Windows.

Ответ 10

По какой-то причине окна не запускали мое приложение (файл .appref-ms) при входе в систему. Итак, я придумал решение, которое другие могут найти полезными.

Когда мое приложение установлено в первый раз (и при запуске моего приложения), я добавляю/проверяю, что текущее местоположение моих приложений string.Concat(Application.ExecutablePath, " ", "/startup") существует в реестре "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run". Когда приложение запускается, я проверяю args на "/startup", и если он присутствует, выполните следующий код.

var startMenuFile = Path.Combine("Programs", Company, Product + ".appref-ms");
var startMenuFolder = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);
var fileName = Path.Combine(startMenuFolder, startMenuFile);

if (File.Exists(fileName))
{
    Process.Start(fileName);
    return;
}

// Log that for some reason, the application doesn't exist.

Это отлично поработало для меня. Но если вы просто добавите значение Application.ExecutablePath в реестр без аргумента "/startup", приложение запустится при запуске Windows, но не в контексте приложения "click once". Это не позволит вам получить доступ к ApplicationDeployment.CurrentDeployment. Хотя, это сработало отлично, проблема все еще существует, что, когда мое приложение удалено, параметр реестра не удаляется. Это можно исправить с помощью утилиты @Иван Леоненко. Надеюсь, это поможет...

Ответ 11

Я делаю это и работаю для меня

 Sub AddToStartup()
    If My.Application.IsNetworkDeployed Then


        Dim str As String = My.Application.Deployment.UpdatedApplicationFullName.ToString

        Dim saida As String = ""

        For i As Integer = 0 To str.Split(",").Length

            If Not saida.Contains("msil") Then
                saida += str.Split(",")(i) & ", "
            End If
        Next

        If saida.Contains("msil") Then
            saida = saida.Substring(0, saida.Length - 2)
        End If

        Dim name As String = My.Application.Info.Title
        Dim file As String = Path.Combine(My.Application.Info.DirectoryPath, name & ".appref-ms")
        My.Computer.FileSystem.WriteAllText(file, saida, False)

        Dim reg As RegistryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", True)
        reg.SetValue(name, file)

    End If


End Sub