Ассоциация расширений файлов Windows 7 - PullRequest
7 голосов
/ 01 сентября 2010

Я имею в виду конкретно windows 7.

У меня есть код, который связывает определенное расширение с моим приложением, как предложено webJose на следующей странице: Какие разделы реестра отвечают за сопоставление расширений файлов? (Однако я правильно пишу в HKEY_CURRENT_USER \ Software \ Classes вместо HKEY_CLASSES_ROOT, как это было предложено)

Вышеуказанное работает изначально, или если нет других программ, связанных с расширением. Однако после использования встроенной в Windows 7 программы «Выбрать программу по умолчанию ...» (находится в контекстном меню, вызываемом правой кнопкой мыши в разделе «Открыть с помощью»), оно повторно связывает расширение с любой новой программой, которую вы выберете.

В этот момент происходит то, что «HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts \\ UserChoice» изменяется системой, и поэтому вновь выбранная программа вступает во владение.

Запустив приведенный выше код, восстановить контроль над расширением не получится. Единственный способ восстановить контроль - либо:

  1. Редактирование значения UserChoice -> Progid, которое недопустимо (ни программно, ни с помощью regedit.exe - доступ запрещен).
  2. Или удалив значение UserChoice и убедившись, что ваше приложение является первым в значении MRUList в \ OpenWithList (это может быть достигнуто с помощью regedit.exe, но не программно)

Мой вопрос: есть ли способ достичь этого программно? Какие значения реестра можно изменить, чтобы восстановить контроль над расширением после того, как он связан с другой программой?

Я знаю, что может показаться очевидным, что если пользователь через проводник устанавливает для связанного приложения расширение, то ожидается, что он будет делать то же самое, чтобы повторно связать расширение с другим приложением.

Проблема, однако, заключается в том, что в моем приложении есть кнопка, которая использует вышеупомянутый код для проверки связи с моим приложением. К сожалению, в описанной выше ситуации мое приложение отображает сообщение, подтверждающее, что расширение уже успешно связано, когда его нет! Так есть ли способ обойти это?

Ответы [ 2 ]

4 голосов
/ 02 сентября 2010

Удаление UserChoice должно вернуть программу по умолчанию к стандартным ключам ассоциации файлов (которые начинаются с ProgID в HKCU).За исключением того, что вы также можете удалить OpenWithList, что может привести к крайнему предубеждению.

Редактировать: Извлечь Ключ реестра и права доступа на MSDN, в частности, RegSetKeySecurity .Помните, что вам нужно предоставить административный контроль над ключом, прежде чем вы сможете его удалить.

2 голосов
/ 04 декабря 2015

Что касается связывания файлов в Windows 7. Возникла новая «проблема».

Это одна из следующих причин: Вы должны бороться за свои права.

Предположим,вам нравится бегать

REG.exe DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mov\UserChoice" /f /va

Вы получите отказ в доступе.Когда вы проверите настройки безопасности ключа в Regedit 'UserChoice', вы увидите, что для вас созданы настройки, чтобы запретить 'set' для текущего пользователя.Ну, вы можете изменить / удалить этот параметр в regedit, и теперь вы можете удалить UserChoice.Однако для программистов / сценаристов этот параметр немного сложноват, поскольку в настоящее время существуют реальные инструменты для настройки списков ACL в реестре.Однако здесь есть обходной путь, который позволяет удалять ключи с помощью ACCESS DENYED (конечно, это работает только в том случае, если вы имеете право изменять разрешения):

ResetMovAssoc.cmd

::create 'empty.hiv' 
REG ADD "HKCU\emptyKey" /f
REG SAVE "HKCU\emptyKey" empty.hiv /y
@REG DELETE "HKCU\emptyKey" /f >nul
::^-note you can add @[...] >nul to the other entries as well to run them quite

:: Delete Reg key by replacing it with an empty hiv
REG RESTORE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mov" empty.hiv
del empty.hiv

Подводя итог, можно сказать, что главное - это REG RESTORE + Файл куста реестра, содержащий просто и пустой ключ.В Regedit это будет эквивалентно Импорту с просто пустым файлом структуры реестра (Примечание: это файл куста, а не файл * .reg).

...