«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как я могу программно связать расширение файла с моим приложением в Windows без использования установщика?

Как я могу программно связать расширение файла с моим приложением в Windows без использования установщика?

Опубликовано в 2025-04-08
Просматривать:569

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

ассоциировать расширения файлов с помощью Application

]]

При разработке приложений, которые редактируют конкретный тип файла, обычно необходимо связывать его в качестве редактора по умолчанию для этого типа файла. Вот надежное решение для достижения этого без использования установщика.

]

код, предоставленный , пытается связать файлы, манипулируя реестрами. Однако он содержит несколько вопросов:

]

]

он открывает реестр текущего пользователя без указания разрешений на чтение и записи, которые могут препятствовать успешно изменению ключа.
    ]
  1. он использует CreateSubkey вместо OpenSubkey, чтобы создать подбори для оболочки, который терпит неудачу, если подразделение уже существует.
  2. ]
  3. ]
код модифицированного ассоциации:

] ниже приведена модифицированная версия кода, которая решает эти проблемы:

]

public static void setAssociation (string extension, string keyname, string filescription, string executePath) { // Откройте реестр текущего пользователя с разрешениями на чтение и запись Использование (RegistryKey CurrentUSER = Registry.currentUser.opensubkey (@"hkey_current_user", Registrypermissioncheck.readwritesubtree, System.security.accesscontrol.registryrights.fullControl))) { Использование (RegistyKey BaseKey = CurrentUser.createSubkey (расширение)) { baseKey.SetValue ("" ", KeyName); } Использование (RegistyKey OpenMethodKey = currentUser.createSubkey (KeyName)) { openmethodkey.setValue ("" ", filedescription); // Если подки "DefaultIcon" не существует, создайте его if (openmethodkey.opensubkey ("defaulticon") == null) { Использование (Registykey DefaultIconkey = OpenMethodKey.CreateSubkey ("defaultiCon")))) { defaulticonkey.setValue ("" "," \ "" executivePath "\", 0 "); } } // Создать подразделение Shell и редактировать и открыть командную подразделение Использование (RegistyKey ShellKey = OpenMethodKey.CreateSubkey ("Shell")) { Использование (RegistyKey EditKeke = ShellKey.CreateSubkey ("edit")) { Использование (RegistyKey EditCommandKey = EditKey.CreateSubkey ("Command")) { EditCommandKey.SetValue ("", "\" "executivePath" \ "\"%1 \ ""); } } Использование (RegistyKey OpenKey = ShellKey.CreateSubkey ("open"))) { Использование (RegistyKey OpenCommandKey = OpenKey.CreateSubkey ("Команда")) { opencommandkey.setValue ("", "," \ "" executivePath "\" \ "%1 \" "); } } } } // Установить PROGID в hkey_current_user \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts Использование (RegistryKey FileExtSkey = CurrentUSER.CreateSubkey (@"Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts \" Extension)))) { fileExtskey.setValue ("progid", keyname); } } // Уведомление об исследователе об изменениях, чтобы обновить свои файловые ассоциации Shchangenotify (shcne_assocchanged, shcnf_flush, intptr.zero, intptr.zero); }
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 Editor", вы можете использовать этот код:

]

setAssociation (". UCS", "ucs_editor_file", "ucs file", application.executablepath);
SetAssociation(".ucs", "UCS_Editor_File", "UCS File", Application.ExecutablePath);
другие меры предосторожности:

] убедитесь, что исполняемый пункт указывает на фактический исполняемый файл, а не на ярлык или комплексный исполняемый файл.

]
    , если расширение файла не зарегистрировано в реестре, необходимо создать соответствующий ключ перед настройкой ассоциации.
  • ]
  • Используйте метод ounteAssociationsSet для автоматического установки ассоциаций нескольких типов файлов.
  • ]
  • ]
  • Этот пересмотренный ответ поддерживает исходное изображение и использует более описательный язык во время реструктуризации текста для улучшения ясности и потока. Код также отформатирован для лучшей читаемости.
  • ]
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3