カスタムURLプロトコル (例: myprotocol://SomeFolder/SomePage
) をClickOnceアプリケーションに関連付けたいと考えています。
問題なく関連付けを作成できます。問題は、アプリケーションが更新されるたびに (頻繁に) EXE ファイルへのパスが変更されることです。
この問題を回避する方法はありますか?
これに対する答えはあなたにはできないようですが、私は解決策を思いつきました。
ショートカットを見つけてその起動パラメーターを ClickOnce アプリケーションに渡すランチャー (非常に単純なアプリケーション) を作成しました。従来の方法でランチャーをインストールする必要がありますが、メイン アプリケーションは必要に応じて ClickOnce で更新できます。
これらのリンクが役立つことがわかりました。
ClickOnce を実行しようとしている場合は、必要な URL プロトコルの値がなくても、適切なキーが HKCR に既に追加されています。このコードをアプリケーション ロジックの先頭に追加しました。
try
{
RegistryKey rk = Registry.ClassesRoot.OpenSubKey("MyProgramName", true);
rk.SetValue("URL Protocol", "");
}
catch (Exception ex)
{
// handle, log, etc.
}
これは、URL プロトコルで参照する必要があったため、うまく機能しました (例: " MyProgramName://....
"。アプリケーションに管理者権限がなくても、これを正常に実行できました。別のハンドラーを登録しようとしている場合は、必要になるかもしれませんが、少なくとも、そこにある値を見ると、アプリケーションを適切に起動する方法がわかります。
デフォルトで作成されるレジストリ キーは次のとおりです。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\MyAppName]
@="Electronic Data Interchange (EDI) File"
"AppId"="MyAppName.application, Culture=neutral, PublicKeyToken=31fc6d113f9bb401, processorArchitecture=msil"
"DeploymentProviderUrl"="file://server/share/MyAppName/MyAppName.application"
"Guid"="{MY_APP_GUID}"
[HKEY_CLASSES_ROOT\MyAppName\shell]
@="open"
[HKEY_CLASSES_ROOT\MyAppName\shell\open]
[HKEY_CLASSES_ROOT\MyAppName\shell\open\command]
@="rundll32.exe dfshim.dll, ShOpenVerbExtension {MY_APP_GUID} %1"
[HKEY_CLASSES_ROOT\MyAppName\shellex]
[HKEY_CLASSES_ROOT\MyAppName\shellex\IconHandler]
@="{MY_APP_GUID}"
そして、私が投稿したコードは、ノードURL Protocol
の下に空の値を持つa を追加するだけです。MyAppName
アプリケーションがシステムにインストールされたら、スタート メニューにリンクを作成します。リンクは、実際には「appref-ms」拡張子を持つファイルです。したがって、トリックは、「appref-ms」を使用してアプリを開くプロトコルを登録することです。
そのため、ClickOnce アプリケーションの起動時に、次のレジストリ エントリを作成してプロトコルを登録できます。HKEY_CLASSES_ROOT myprotocol = {プロトコルの説明} シェルを開くコマンド = エクスプローラー %1
それでおしまい。誰かが myprotocol: XXX のような URL をクリックすると、アプリが開かれ、「ClickOnce」アプリケーションとして開かれるため、新しいバージョンがあるかどうかなどがチェックされます。