ホームページ > バックエンド開発 > C++ > インストーラーを使用せずに、Windows でプログラムによってファイル拡張子をアプリケーションに関連付けるにはどうすればよいですか?

インストーラーを使用せずに、Windows でプログラムによってファイル拡張子をアプリケーションに関連付けるにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-19 23:46:09
オリジナル
540 人が閲覧しました

How can I programmatically associate a file extension with my application in Windows without using an installer?

ファイル拡張子をアプリケーションに関連付ける

特定のファイル タイプを編集するアプリケーションを開発する場合、多くの場合、アプリケーションをそのファイル タイプのデフォルトのエディタに関連付ける必要があります。インストーラーを使用せずにこれを実現する方法に関する確実な解決策を次に示します。

関連付けメソッドの実装:

提供されたコードは、レジストリを操作してファイルを関連付けようとします。ただし、これにはいくつかの問題が含まれています:

  1. 読み取りおよび書き込み権限を指定せずに現在のユーザーのレジストリを開くため、キーを正常に変更できない可能性があります。
  2. OpenSubKey の代わりに CreateSubKey を使用してシェル サブキーを作成しますが、サブキーが既に存在する場合は失敗します。

変更された関連付けコード:

これらの問題を解決するコードの修正バージョンを次に示します。

<code class="language-csharp">public static void SetAssociation(string extension, string keyName, string fileDescription, string executablePath)
{
    // 以读写权限打开当前用户的注册表
    using (RegistryKey currentUser = Registry.CurrentUser.OpenSubKey(@"HKEY_CURRENT_USER", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl))
    {
        using (RegistryKey baseKey = currentUser.CreateSubKey(extension))
        {
            baseKey.SetValue("", keyName);
        }

        using (RegistryKey openMethodKey = currentUser.CreateSubKey(keyName))
        {
            openMethodKey.SetValue("", fileDescription);

            // 如果“DefaultIcon”子密钥不存在,则创建它
            if (openMethodKey.OpenSubKey("DefaultIcon") == null)
            {
                using (RegistryKey defaultIconKey = openMethodKey.CreateSubKey("DefaultIcon"))
                {
                    defaultIconKey.SetValue("", "\"" + executablePath + "\",0");
                }
            }

            // 创建 Shell 子密钥并编辑和打开命令子密钥
            using (RegistryKey shellKey = openMethodKey.CreateSubKey("Shell"))
            {
                using (RegistryKey editKey = shellKey.CreateSubKey("edit"))
                {
                    using (RegistryKey editCommandKey = editKey.CreateSubKey("command"))
                    {
                        editCommandKey.SetValue("", "\"" + executablePath + "\" \"%1\"");
                    }
                }

                using (RegistryKey openKey = shellKey.CreateSubKey("open"))
                {
                    using (RegistryKey openCommandKey = openKey.CreateSubKey("command"))
                    {
                        openCommandKey.SetValue("", "\"" + executablePath + "\" \"%1\"");
                    }
                }
            }
        }

        // 在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts 中设置 ProgId
        using (RegistryKey fileExtsKey = currentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" + extension))
        {
            fileExtsKey.SetValue("Progid", keyName);
        }
    }

    // 通知资源管理器更改以刷新其文件关联
    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, IntPtr.Zero, IntPtr.Zero);
}</code>
ログイン後にコピー

使用例:

.ucs ファイル拡張子を「UCS Editor」というアプリケーションに関連付けるには、次のコードを使用できます:

<code class="language-csharp">SetAssociation(".ucs", "UCS_Editor_File", "UCS File", Application.ExecutablePath);</code>
ログイン後にコピー

その他の注意事項:

  • executablePath がショートカットやバンドルされた実行可能ファイルではなく、実際の実行可能ファイルを指していることを確認してください。
  • ファイル拡張子がレジストリにまだ登録されていない場合は、関連付けを設定する前に、対応するキーを作成する必要があります。
  • EnsureAssociationsSet メソッドを使用して、複数のファイル タイプの関連付けを自動的に設定します。

この改訂された回答では、元のイメージを維持し、より説明的な言語を使用するとともに、テキストを再構築して明瞭さと流れを改善しています。

以上がインストーラーを使用せずに、Windows でプログラムによってファイル拡張子をアプリケーションに関連付けるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート