NSIS文件关联在Windows 7中更改
我需要强制更改特定文件类型extenson.theext的文件关联,以便在使用NSIS安装应用程序时使用myapp.exe打开 我已经阅读了一些关于如何实现这一点的建议,这就是我在NSIS脚本中的内容:NSIS文件关联在Windows 7中更改,nsis,file-extension,file-association,Nsis,File Extension,File Association,我需要强制更改特定文件类型extenson.theext的文件关联,以便在使用NSIS安装应用程序时使用myapp.exe打开 我已经阅读了一些关于如何实现这一点的建议,这就是我在NSIS脚本中的内容: DeleteRegKey HKCR ".theext" DeleteRegKey HKLM ".theext" DeleteRegKey HKCU ".theext" WriteRegStr HKCR ".theext" "" "theextfile" WriteRegStr HKCR
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"
为了测试这一点,我使用Windows7资源管理器将文件assoc设置为GVIM.exe
这样做之后,每次运行安装程序时,Windows 7都会使用GVim而不是MyApp.exe双击打开文件
但当我按如下方式检查文件Associan时,一切似乎都很好:
ftype | findstr /i theext
给出:
theextfile="C:\Program File (x86)\My App\myapp.exe" "%1"
你正在做你应该做的一切,如果扩展还没有被其他人注册,你将成为默认的。你不应该首先删除旧的密钥,虽然它可能会破坏系统,但它永远不会帮助你成为默认的。强迫某些东西是邪恶的,用户应该是控制者 因为在过去人们强迫这样做,微软开始使更改默认设置变得更加困难。未记录的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中,您所能做的就是启动通用UI:
!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在shell中实际运行关联代码时才知道默认值。IApplicationAssociationRegistration::QueryCurrentDefault更擅长猜测默认值,但如果默认值实际上是覆盖默认值的COM外壳扩展,即使它也可能失败。使用regedit进行搜索。看起来像HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\。Text\OpenWith列表有多个entrie a、b、c、d、e,最后一个是GVim。我将对此进行进一步研究。OpenWithList只是可以打开的额外项目,它不控制默认值。我添加了DeleteRegKey HKCU Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.notebook\UserChoice来清除UserChoice注册表值,现在它可以工作了。Win7需要测试它在Win10上是否有效。