「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > インストーラーを使用せずにファイル拡張機能をWindowsでアプリケーションにプログラム的に関連付けるにはどうすればよいですか?

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

2025-04-08に投稿
ブラウズ:586

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

アソシエイトファイル拡張子をアプリケーション

]

特定のファイルタイプを編集するアプリケーションを開発する場合、通常、そのファイルタイプのデフォルトエディターとして関連付ける必要があります。インストーラーを使用せずにこれを達成するための信頼できるソリューションを次に示します。

協会の実装方法:

が提供するコードは、レジストリを操作することによりファイルを関連付けようとします。ただし、いくつかの質問が含まれています。
  1. 読み取り許可を指定せずに現在のユーザーのレジストリを開きます。これにより、キーが正常に変更されないようになります。
  2. opensubkeyの代わりにcreateSubkeyを使用してシェルサブキーを作成しますが、サブキーが既に存在する場合は失敗します。

修正された協会コード:

以下は、これらの問題を解決するコードの変更されたバージョンです:

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);
}

使用法の例:

.ucsファイル拡張子を「UCSエディター」という名前のアプリケーションに関連付けるには、このコードを使用できます。

SetAssociation(".ucs", "UCS_Editor_File", "UCS File", Application.ExecutablePath);

その他の注意事項:

    execupablePathは、ショートカットまたはバンドルされた実行可能ファイルではなく、実際の実行可能ファイルを指していることを確認してください。
  • ファイル拡張子がレジストリに登録されていない場合、関連性を設定する前に対応するキーを作成する必要があります。
  • Ensureassociationssetメソッドを使用して、複数のファイルタイプの関連付けを自動的に設定します。
この改訂された応答は、元の画像を維持し、より記述的な言語を使用しながら、テキストを再構築し、明確さと流れを改善します。コードも読みやすくするためにフォーマットされています。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3