У меня есть несколько вопросов:
1) Можно ли сделать так, чтобы моя программа меняла ассоциацию типа файла, но только когда она запущена? Вы не видите ничего плохого в таком поведении?
2) Другой вариант, который я вижу, - это позволить пользователям решить открыть с моим приложением или восстановить ассоциацию по умолчанию ... что-то вроде: «захватить все файлы .lala» или «восстановить ассоциацию .lala». Как я могу это сделать? Как вы думаете, что это лучший подход?





Вероятно, это можно сделать, но я думаю, что это окажется громоздким. Все ассоциации типов файлов хранятся в реестре, поэтому вам придется записывать / восстанавливать записи реестра каждый раз, когда ваше приложение запускается и останавливается. Кроме того, в зависимости от того, как часто вы это делаете, новые ассоциации могут не сразу улавливаться в проводнике Windows.
Связи перечислены в разделе HKEY_CLASSES_ROOT в реестре и могут быть сопоставлены множеством способов (типы mime / progID / и т. д.).
Многие приложения, которые я видел, спрашивают, хотите ли вы связать определенные типы файлов с приложением во время установки, и дают вам возможность отказаться и оставить текущие настройки.
Я не думаю, что рекомендовал бы ассоциации типов файлов "на лету"
1) вы можете определить типы файлов, которые находятся в списке типов файлов Open Dialog. В остальном это возможный, чтобы изменить тип файла по умолчанию при открытии приложения, а затем заменить при закрытии приложения, поскольку ассоциация типов файлов - это просто параметр реестра.
Что касается неправильного, я бы не стал. Первая причина в том, что это нестандартное поведение приложений. Вторая причина заключается в том, что если ваше приложение или компьютер неожиданно завершает работу, вы рискуете не вернуть связь к исходной настройке.
2) Windows по умолчанию позволяет пользователю выбирать эти параметры с помощью щелчка правой кнопкой мыши и команды «открыть с помощью».
Что касается ассоциаций файлов, я ранее писал ответ, что по крайней мере охватывает "Как".
Это также должно указать вам правильное направление работы с резервным копированием и восстановлением. При прямом доступе к реестру через C# нет необходимости использовать файлы .reg, поэтому вы можете создать резервную копию предыдущего значения, как вам нравится, в своем приложении, а также восстановить его оттуда.
Ключевой вопрос здесь: Должен вы случайно меняете ассоциации файлов? По крайней мере, очевидно, что необходимо заранее спросить пользователя (как вы также указали).
Более того, пользователи Vista с включенным UAC или непривилегированные пользователи других версий Windows могут не иметь необходимого разрешения на изменение глобальных ассоциаций файлов. Процедура (не) установки вашей программы может быть единственным местом, где это может быть успешным.
РЕДАКТИРОВАТЬ
Как и Франси Пенов указал в своем ответе, является позволяет изменять локальные ассоциации файлов для каждого пользователя, даже для пользователей, не являющихся администраторами (вот почему я говорил о «глобальных ассоциациях» в предыдущем абзаце). Он также упомянул, почему ехать туда не рекомендуется.
Вы можете реализовать изменение ассоциации файлов "на лету", связав небольшой исполняемый файл с этим расширением файла, который при запуске будет проверять, запущено ли ваше основное приложение, и передаст ему имя файла, или, если оно не запущено, вызовет команду " обычное "связанное приложение".
Главное преимущество такого подхода в том, что гадить с реестром нужно только один раз.
Основными недостатками такого подхода являются:
Кроме того, вы можете изменить ассоциацию файлов при запуске основной программы. Это будет работать даже для пользователей без прав администратора. Хотя файловые ассоциации хранятся в HKEY_CLASSES_ROOT, есть небольшая хитрость - HKCR на самом деле является картой как HKEY_LOCAL_MACHINE\SOFTWARE\Classes, так и HKEY_CURRENT_USER\SOFTWARE\Classes. Таким образом, вы можете временно зарегистрировать расширение файла для текущего пользователя в HKCU и «затенять» исходную ассоциацию из HKLM.
Конечно, я бы посоветовал не использовать этот подход, поскольку в вашем приложении требуется всего один сбой, чтобы сделать эту связь постоянной, и поскольку очень немногие приложения знают, как работать с ассоциациями файлов в HKCU, есть вероятность, что это будет неустранимая ситуация для оригинальное приложение.
Другая проблема заключается в том, что если ваше приложение выйдет из строя, оно оставит неправильно связанное расширение. Очень неприятно иметь программу, которая изменяет настройки компьютера таким образом и оставляет их «поврежденными» при сбое.