Как я могу заставить приложение, развернутое по клику, запускаться при запуске? - PullRequest
22 голосов
/ 31 декабря 2008

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

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

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

Ответы [ 11 ]

25 голосов
/ 01 января 2012

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

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

// 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);
12 голосов
/ 06 мая 2014

Прочитав все комментарии к этой теме и посту в блоге johnnycoder, упомянутому выше , я нашел решение, которое:

  1. Добавляет приложение ClickOnce в папку «Автозагрузка»
  2. Удаляет элемент автозагрузки автоматически при удалении приложения ClickOnce (после перезагрузки или выхода из системы / входа в систему)
  3. Был протестирован и работает на 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

5 голосов
/ 11 мая 2009

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

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

2 голосов
/ 08 августа 2015

Прежде всего, спасибо за ответ 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);
2 голосов
/ 23 июля 2015

Спасибо 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);
        }
2 голосов
/ 11 декабря 2012

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

1 голос
/ 09 мая 2012

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

1 голос
/ 31 декабря 2008

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

1 голос
/ 31 декабря 2008

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

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

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

0 голосов
/ 28 марта 2017

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

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...