Вы делаете все, что должны, и если расширение еще не зарегистрировано кем-то другим, вы станете по умолчанию.Вы не должны сначала удалять старые ключи (это может испортить систему, но это никогда не поможет вам стать по умолчанию).Принудительное принуждение к чему-либо является злом, пользователь, как предполагается, контролирует ситуацию.
Поскольку люди заставляли это в прошлом, 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, которое переопределяет значение по умолчанию.