代码之家  ›  专栏  ›  技术社区  ›  TenG

Windows 7中NSIS文件关联更改

  •  0
  • TenG  · 技术社区  · 7 年前

    在使用NSIS安装应用程序时,我需要(强制)将特定文件类型(extension.theext)的文件关联更改为使用“myapp.exe”打开。

    我读过一些关于如何实现这一点的建议,所以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"   
    

    为了测试这个,我使用Windows7资源管理器将文件assoc设置为gvim.exe。

    这样做之后,每当我运行安装程序时,Windows 7仍然使用GVIM双击打开文件,而不是“MyApp.exe”。

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

    ftype | findstr /i theext
    

    给予:

    theextfile="C:\Program File (x86)\My App\myapp.exe" "%1"
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Anders    7 年前

    你正在做所有你应该做的事情,如果扩展没有被其他人注册,你将成为默认的。不过,您不应该首先删除旧密钥(这可能会导致系统崩溃,但它永远不会帮助您成为默认值)。强迫某事是邪恶的,用户应该处于控制之中。

    因为过去人们强迫微软开始改变默认状态。无证 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} $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}
    

    在Windows10中,即使没有这个功能,它也只会显示一个toast,告诉用户如果调用launchAdvancedAssociationUI来更改他们的设置。

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