Автозапуск приложения ClickOnce в тихом режиме
Вопрос
У меня есть приложение, которое использует НажмитеOnce для развертывания, и мне удалось запустить приложение при входе пользователя в систему.
Моя проблема заключается в том, что мне нужно, чтобы приложение запускалось скрыто (я не хочу, чтобы пользователю приходилось сворачивать его до тех пор, пока оно ему не понадобится - я хочу, чтобы оно находилось на панели задач).Перед использованием ClickOnce я просто проверял аргументы, чтобы убедиться, что было передано «/silent».Похоже, что в приложении ClickOnce это невозможно сделать (вы можете проверить, передается ли строка запроса URI, но поскольку она запускается из ярлыка .appref-ms, похоже, нет способа получить /silent
аргумент)
Как я могу получить /silent
аргумент или как узнать, запустилось ли приложение в результате входа пользователя в систему (а не того, что пользователь запустил приложение с ярлыка)?
Важно, чтобы любое предлагаемое решение не требовало прав администратора, но используемый язык не так важен, поскольку я, вероятно, смогу перенести его на .NET.
Решение
Я не думаю, что есть очень простой способ сделать это, поскольку аргументы команды не работают, и вы не можете использовать аргументы строки запроса.
Однако попробуйте развернуть еще один небольшой исполняемый файл вместе с развертыванием ClickOnce.Он будет отвечать за установку флага «запуска» (в файле конфигурации, реестре и т. д.), а затем за запуск вашего фактического приложения.Ваше приложение проверит флаг, чтобы определить, должно ли оно запускаться автоматически, а затем сбросит флаг.Тогда у вас будет просто небольшой исполняемый файл, запускаемый с Windows, а не основное приложение.
Конечно, я ничего из этого не пробовал.
Другие советы
Вы можете сделать это следующим образом:
В вашем основном методе:
if ((args.Length > 0 && args[0].ToLower() == "minimized") ||
(AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData != null && AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData.Length > 0 &&
AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0] == "minimized"))//ClickOnce arguments
{
//My code to start minimized. My system tray is always visible
main.WindowState = FormWindowState.Minimized;
main.Hide();
main.ShowInTaskbar = false;
}
else {
//Code to start normally
main.WindowState = FormWindowState.Normal;
main.ShowInTaskbar = true;
main.Show();
}
Затем вы можете просто передать аргумент «свернутый» с помощью приложения ClickOnce, чтобы запустить его в свернутом виде.
Чтобы запустить приложение ClickOnce автоматически, я создаю такой ярлык:
CreateShortcut(Environment.GetFolderPath(Environment.SpecialFolder.Programs) + @"\LVH Tools\MyMiniTools.appref-ms", Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\MyMiniTools", "minimized")
«MyMiniTools» — это имя приложения, а «LVH Tools» — имя издателя.
Создать ярлык:
public void CreateShortcut(string destinationPath, string shortcutPath, string arguments = "")
{
IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell();
shortcutPath = Path.ChangeExtension(shortcutPath, "lnk");
IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(shortcutPath);
shortcut.TargetPath = destinationPath;
shortcut.IconLocation = destinationPath;
shortcut.Arguments = arguments;
shortcut.Description = Path.GetFileNameWithoutExtension(destinationPath);
shortcut.Save();
}
Другой метод включения автозапуска с помощью ClickOnce описан в разделе Автозапуск и полное удаление приложения ClickOnce или способ настройки установки ClickOnce.