如何使Click-once部署的应用程序运行启动?
我通过搜索找到的最佳选项是将应用程序上的Publisher设置为Startup,因此Start菜单快捷方式将放在Startup文件夹中,但这似乎是一个巨大的黑客,我希望有一个开始菜单图标人可以找到.
我有什么选择?
我觉得将您的应用程序添加到启动文件夹是不专业的.我强烈建议使用启动注册表项来启动您的应用程序.
与此主题的许多材料相反,设置密钥以在应用程序启动单击时非常简单,并且不需要设置其他快捷方式.您只需使用在安装时创建的快捷方式:
// 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博客文章的所有评论之后,我想出了一个解决方案:
将ClickOnce应用程序添加到Startup文件夹
卸载ClickOnce应用程序时(重启或注销/登录后)自动删除启动项
经过测试,适用于Windows XP,Windows 7,Windows Server 2000/2003,Windows 8
我的解决方案
基本上,您的应用程序将把.bat
文件写入Startup文件夹,为您启动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文件是否存在)并启动它(如果存在).否则,批处理文件将通过此处概述的方法删除自身.
现在您已拥有批处理文件,请将其测试出来.将其放在Startup文件夹中,以确保它在登录时启动您的应用程序.
第2步
现在,在应用程序的代码中,您需要将此批处理文件写入Startup文件夹.下面是在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的"安全性".请参阅blogpost,了解如何在Windows启动时运行clickonce应用程序.