Изменение файловых ассоциаций NSIS в Windows 7
У меня есть требование (принудительно) изменить сопоставление файлов для определенного типа файлов (расширение ".theext"), чтобы открыть с помощью "myapp.exe" при установке приложения с помощью NSIS.
Я прочитал несколько предложений о том, как этого добиться, так что currentky это то, что у меня есть в моем сценарии NSIS:
DeleteRegKey HKCR ".theext"
DeleteRegKey HKLM ".theext"
DeleteRegKey HKCU ".theext"
WriteRegStr HKCR ".theext" "" "theextfile"
WriteRegStr HKCR "theextfile" "" "My App Document"
WriteRegStr HKCR "theextfile\DefaultIcon" "" "$INSTDIR\${EXENAME}.exe,0"
WriteRegStr HKCR "theextfile\shell\open\command" "" '"$INSTDIR\${EXENAME}.exe" "%1"'
WriteRegStr HKCR "theextfile\shell\print\command" "" '"$INSTDIR\${EXENAME}.exe" /p "%1"'
WriteRegStr HKLM "Software\RegisteredApplications" "${EXENAME}" "$INSTDIR\${EXENAME}.exe"
WriteRegStr HKCU "Software\RegisteredApplications" "${EXENAME}" "$INSTDIR\${EXENAME}.exe"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.theext\OpenWithList" "a" "$INSTDIR\${EXENAME}.exe"
Чтобы проверить это, я установил привязку файла с помощью WIndows 7 Explorer к GVIM.exe.
После этого каждый раз, когда я запускаю установщик, Windows 7 по-прежнему открывает файл двойным щелчком, используя GVim, а не "MyApp.exe".
Но когда я проверяю файл ассоциата следующим образом, все выглядит нормально:
ftype | findstr /i theext
дает:
theextfile="C:\Program File (x86)\My App\myapp.exe" "%1"
1 ответ
Вы делаете все, что должны, и если расширение еще не зарегистрировано кем-то другим, вы станете по умолчанию. Вы не должны сначала удалять старые ключи (это может испортить систему, но это никогда не поможет вам стать по умолчанию). Принуждение к чему-либо является злом, пользователь должен контролировать.
Потому что люди заставляли это в прошлом, Microsoft начала усложнять изменение по умолчанию. Недокументированный FileExts
ключ хранит выбранные по умолчанию пользователи в UserChoice
суб-ключей. В более новых версиях Windows (8+?) Значение по умолчанию проверяется с использованием некоторого секретного хэша, поэтому вы не можете его переопределить.
IApplicationAssociationRegistration
Интерфейс не работает в более новой версии Windows, но он может работать в Windows 7:
!include Win\COM.nsh
!include WinCore.nsh
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationAssociationRegistration} ${IID_IApplicationAssociationRegistration} r0 ""
${If} $0 P<> 0
${IApplicationAssociationRegistration::SetAppAsDefault} $0 '("MyApp", ".myext", ${AT_FILEEXTENSION})'
${IUnknown::Release} $0 ""
${EndIf}
В Windows 8 все, что вы можете сделать, это запустить общий интерфейс:
!include Win\COM.nsh
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationAssociationRegistrationUI} ${IID_IApplicationAssociationRegistrationUI} r0 ""
${If} $0 P<> 0
${IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI} $0 '("Wordpad")' ; Replace with your name from the RegisteredApplications key
${IUnknown::Release} $0 ""
${EndIf}
В Windows 10 даже этого нет, он просто отображает тост, в котором пользователю предлагается изменить свои настройки, если вы вызываете LaunchAdvancedAssociationUI.
ftype
не знает истинное значение по умолчанию, значение по умолчанию известно только тогда, когда Windows фактически выполняет код ассоциации в оболочке. IApplicationAssociationRegistration::QueryCurrentDefault
лучше угадать значение по умолчанию, но даже он может потерпеть неудачу, если по умолчанию это расширение оболочки COM, которое переопределяет значение по умолчанию.