首页 > 后端开发 > 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. 它使用 CreateSubKey 而不是 OpenSubKey 来创建 Shell 子密钥,如果子密钥已存在,则会失败。

修改后的关联代码:

以下是解决这些问题的代码的修改版本:

<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 方法自动设置多种文件类型的关联。

This revised response maintains the original image and uses more descriptive language while restructuring the text for improved clarity and flow. The code is also formatted for better readability.

以上是如何在不使用安装程序的情况下以编程方式将文件扩展名与 Windows 中的应用程序关联?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板