Windows 7 中的 NSIS 文件关联更改

NSIS File Associations change in Windows 7

我需要(强制)更改特定文件类型(扩展名“.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"   

为了对此进行测试,我使用 WIndows 7 Explorer 将文件关联设置为 GVIM.exe。

自从这样做以来,每次我 运行 安装程序时,Windows 7 仍然使用 GVim 双击打开文件,而不是 "MyApp.exe"。

但是当我如下检查文件关联时,一切似乎都很好:

ftype | findstr /i theext

给出:

theextfile="C:\Program File (x86)\My App\myapp.exe" "%1"

你正在做你应该做的一切,如果扩展没有被其他人注册,你将成为默认。你真的不应该先删除旧密钥(它会搞砸系统,但它永远不会帮助你成为默认值)。强迫某事是邪恶的,用户应该处于控制之中。

因为过去人们强制这样做 Microsoft 开始使更改默认设置变得更加困难。未记录的 FileExts 密钥将用户选择的默认值存储在 UserChoice 子密钥中。在 Windows(8+?)的较新版本中,默认值已通过一些 secret hash 验证,因此您无法覆盖它。

IApplicationAssociationRegistration 接口在较新版本的 Windows 中不起作用,但它可能在 Windows 7:

中起作用
!include Win\COM.nsh
!include WinCore.nsh
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationAssociationRegistration} ${IID_IApplicationAssociationRegistration} r0 ""
${If} [=10=] P<> 0
    ${IApplicationAssociationRegistration::SetAppAsDefault} [=10=] '("MyApp", ".myext", ${AT_FILEEXTENSION})'
    ${IUnknown::Release} [=10=] ""
${EndIf}

在 Windows 8 中,您所能做的就是启动通用 UI:

!include Win\COM.nsh
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationAssociationRegistrationUI} ${IID_IApplicationAssociationRegistrationUI} r0 ""
${If} [=11=] P<> 0
    ${IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI} [=11=] '("Wordpad")' ; Replace with your name from the RegisteredApplications key
    ${IUnknown::Release} [=11=] ""
${EndIf}

在 Windows10 中,即使它消失了,如果您调用 LaunchAdvancedAssociationUI.

,它只会显示提示信息,告诉用户更改他们的设置

ftype不知道真正的默认值,只有当Windows实际运行shell中的关联代码时才知道默认值。 IApplicationAssociationRegistration::QueryCurrentDefault 更擅长猜测默认值,但如果默认值实际上是覆盖默认值的 COM shell 扩展,即使它也可能会失败。