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 ブログ投稿を読んだ後、次の解決策を思いつきました。
私の解決策
基本的に、アプリは.bat
、ClickOnce アプリを起動する Startup フォルダーにファイルを書き込みます。この.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)
バッチ ファイルは、(appref-ms ファイルが存在するかどうかを確認することによって) ClickOnce アプリがインストールされているかどうかを確認し、インストールされている場合は起動します。それ以外の場合、バッチ ファイルは、ここで概説されている方法で自身を削除します。
バッチ ファイルが作成されたので、テストします。これを Startup フォルダーにドロップして、ログイン時にアプリが確実に起動するようにします。
ステップ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 アプリを実行する方法については、ブログ投稿を参照してください。
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 を別のコード ページで使用し、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);
起動時にアプリケーションを起動する方法はいくつかありますが、クリーンアップの問題があります。スタートアップ レジストリ キーを使用して問題ないように見えても、システムに追加したものはすべて消去する必要があります。私の記事をご覧ください。同じクリーンアップの問題に直面し、自動化とカスタム アンインストール ファイルを使用して問題を解決しました。
これに対する解決策をまだ探している他の人に役立つ場合は、一番下のコメントhttp://johnnycoder.com/blog/2009/02/24/clickonce-run-at-startup/が ClickOnce Publish オプションの設定を提案しています ( VS.Net 2010 では、プロジェクトのプロパティ、パブリッシュ画面、およびオプションにあります)、パブリッシャー名をスタートアップに設定し、スイート名を空白のままにします。これにより、Windows 7 のスタートアップ フォルダーにプログラムのショートカットが作成されます。他のバージョンの Windows で何が行われるかはわかりません。
起動時に実際にアプリケーションを起動させるという点では、スタートアップ フォルダーにリンクを設定するのが最善の策です。または、スタートアップ フォルダでない場合は、スタートアップ reg キー。
アイコンが通常の位置にないことを回避する方法は、アプリケーションの起動時にアプリケーション自体へのリンクをスタートアップ フォルダに配置することです。ClickOnce アプリは、初回インストール時に実行されます。アプリケーションは、このスタートアップを使用して、スタートアップ フォルダーにリンクを配置できます。これで、リンクが両方の場所に配置され、ゴールデンになるはずです。
ただし、ClickOnce アプリを削除しても実際には削除されないという問題があります。ClickOnce は追加された手動リンクを追跡しないため、誰かがアプリをアンインストールして再起動するたびに再インストールされます。私はそのプログラムがうまく動作していないと考え始めます:(。
起動時に、アプリを適切な「実行」スタートアップ レジストリ キーに追加できます。その後、アプリが削除されたときにそれを削除することはできませんが、何も害はなく、誰も壊れた参照を見ることはありません.
なんらかの理由で、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
。これはうまく機能しましたが、アプリケーションをアンインストールしてもレジストリ設定が削除されないという問題が依然として存在します。これは、@Ivan Leonenkoカスタム アンインストール ソリューションを使用して修正できます。お役に立てれば...