起動時にClick-onceデプロイ済みアプリを実行するにはどうすればよいですか?
質問
Click-onceデプロイ済みアプリにスタートアップを実行させるにはどうすればよいですか
検索で見つけた最良のオプションは、アプリのパブリッシャーを[スタートアップ]に設定することでした。そのため、[スタート]メニューのショートカットが[スタートアップ]フォルダーに配置されます。人々が見つけることができるメニューアイコン。
どのようなオプションがありますか
解決
アプリケーションをスタートアップフォルダに追加するのは専門的ではないと感じています。スタートアップレジストリキーを使用してアプリケーションを起動することを強くお勧めします。
このトピックの多くの資料で述べられていることとは異なり、ワンクリッククリックアプリケーションを起動するキーを設定するのは非常に簡単で、追加のショートカットを設定する必要はありません。インストール時に作成されたショートカットを使用するだけです:
// 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アプリをスタートアップフォルダーに追加します
- ClickOnceアプリがアンインストールされると(再起動またはログアウト/ログイン後)、スタートアップ項目が自動的に削除されます
- Windows XP、Windows 7、Windows Server 2000/2003、Windows 8でテストおよび動作しました
マイソリューション
基本的に、アプリはClickcodeを起動するStartupフォルダーに .bat
ファイルを書き込みます。 .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
今、アプリのコードで、このバッチファイルをStartupフォルダーに書き込む必要があります。 C#で上記のバッチファイルを使用した例を次に示します(エスケープや環境変数のブードゥーが発生していることに注意してください):
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の「セキュリティ」を簡単にバイパスできます。これに。 Windows起動時にclickonceアプリを実行する方法に関するブログ投稿を参照してください。
まあ、起動時にアプリケーションを起動する方法はいくつかありますが、クリーンアップの問題があります。スタートアップレジストリキーを使用して正常に表示される場合でも、システムに追加したものはすべて削除する必要があります。 私の記事を見てみると、同じ問題に直面している問題を解決し、自動化と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の回答に感謝します。これを&#197;で動作させるには&#196; &#214; UTF-8とは異なるコードページを使用し、BOMは使用しませんでした。
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);
実際に起動時にアプリケーションを起動させるという点では、起動フォルダーにリンクを置くのが最善の策です。または、スタートアップフォルダでない場合は、スタートアップregキー。
アイコンが通常の位置にないことを回避する方法は、アプリケーションの起動時に、アプリケーションが自分自身へのリンクを起動フォルダーに配置することです。 ClickOnceアプリは、初めてインストールされたときに実行されます。アプリケーションはこのスタートアップを使用して、スタートアップフォルダにリンクを配置できます。これでリンクは両方の場所にあり、黄金色になります。
ClickOnceアプリを削除しても実際には削除されないという問題があります。 ClickOnceは追加された手動リンクを追跡しないため、誰かがアプリをアンインストールして再起動するたびに再インストールされます。私はそのプログラムがうまく動作しないことを検討し始めます:(。
アプリを適切な「実行」に追加できます。起動時の起動レジストリキー。そうすれば、アプリを削除したときに削除することはできませんが、何も害はなく、壊れた参照は誰にも表示されません。
この問題の解決策を探している他の人の助けになる場合は、下にコメントを書く http://johnnycoder.com/blog/2009/02/24/clickonce-run-at-startup/ は、ClickOnceの公開オプションを設定することを提案しています(VS.Net 2010ではプロジェクトのプロパティ、公開画面、およびオプション)、[パブリッシャー名]を[スタートアップ]に設定し、スイート名を空白のままにします。これにより、Windows 7ではプログラムショートカットがスタートアップフォルダーに移動します。他のバージョンのWindowsが何をするのかわかりません。
何らかの理由で、ログイン時にWindowsがアプリ(&quot; .appref-ms&quot;ファイル)を起動しませんでした。だから、他の人にも役立つ解決策を思いつきました。
アプリの初回インストール時(およびアプリの起動時)に、アプリケーションの現在の場所を追加/検証します string.Concat(Application.ExecutablePath、&quot;&quot ;,&quot; / startup&quot;)
はレジストリ&quot; HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run&quot;
に存在します。その後、アプリケーションが起動したら、&quot; / startup&quot;の引数を確認します。そして、それが存在する場合、次のコードを実行します。
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.
これは私にとってはうまくいきました。ただし、&quot; / startup&quot;
引数なしで Application.ExecutablePath
値をレジストリに追加するだけの場合、アプリケーションはWindowsの起動時に起動しますが、コンテキストでは起動しません「1回クリック」応用。これにより、 ApplicationDeployment.CurrentDeployment
にアクセスできなくなります。これはうまく機能しましたが、アプリケーションをアンインストールしてもレジストリ設定が削除されないという問題が依然として存在します。これは、 @Ivan Leonenko カスタムアンインストールソリューションを使用して修正できます。これがお役に立てば幸いです...
これを作成して私のために働きます
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