NSIS文件关联在Windows 7中更改

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

我需要强制更改特定文件类型extenson.theext的文件关联,以便在使用NSIS安装应用程序时使用myapp.exe打开

我已经阅读了一些关于如何实现这一点的建议,这就是我在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"   
为了测试这一点,我使用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上是否有效。