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

StackOverflow https://stackoverflow.com/questions/401816

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Спасибо 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);
        }

Во-первых, спасибо за ответ 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);

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

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

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

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

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

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

Когда мое приложение устанавливается в первый раз (и при запуске моего приложения), я добавляю / проверяю текущее местоположение моих приложений string.Concat(Application.ExecutablePath, " ", "/startup") существует в реестре "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run".Затем, когда приложение запускается, я проверяю аргументы на наличие "/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, но не в контексте приложения "щелкните один раз".Это не позволит вам получить доступ к ApplicationDeployment.CurrentDeployment.Хотя это отлично сработало, проблема по-прежнему существует в том, что при удалении моего приложения параметр реестра не удаляется.Это можно исправить с помощью @Иван Леоненко пользовательское решение для удаления.Надеюсь, это поможет...

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

 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top