我创建了一个电子应用程序。在Windows 8后,将应用程序设置为默认邮件客户端需要更改以下位置的注册表值:
计算机\ HKEY_CURRENT_USER \软件\ Microsoft \ Windows \ Shell \ Associations \ UrlAssociations \ mailto \ UserChoice
由于我正在使用电子构建器来构建我的应用程序,并且使用Windows的nsis
目标,我可以在哪里为我的应用程序创建/设置/查看ProgId
?如果可以的话,如何创建多个ProgId
?
答案 0 :(得分:1)
您不能像这样覆盖关联。
UserChoice
(和FileExts
)键没有记录,您不应写它们。
由于人们force themselves忽略了“ What if two programs did this?”的问题,Microsoft使得以编程方式为类型/应用程序设置默认关联变得越来越困难。
如果您在Windows的最新版本中浏览UserChoice
键,您还将看到一个Hash
值。如果ProgId
值与哈希值不匹配,则Windows将忽略您尝试接管关联的尝试。只有ControlPanel / Settings用户界面才能成功更改这些系统上的关联。
在企业环境中,您可以使用DISM/GPO。普通用户安装的应用程序无法执行此操作,您唯一的选择是遵循Microsoft guidelines:
在HKEY_CLASSES_ROOT中以常规记录的方式注册您的关联。
此外,您可以:
WinVista和Win7 :您可以使用IApplicationAssociationRegistration
界面(不推荐)来强迫自己。
Win8 :询问用户是否要更改其关联以及是否确认可以致电IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI
。
Win10 :调用IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI
至display a help-popup,指示用户如何更改其关联。
LaunchAdvancedAssociationUI
可以在NSIS v3 +中像这样使用:
!include LogicLib.nsh
!include Win\COM.nsh
Section
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationAssociationRegistrationUI} ${IID_IApplicationAssociationRegistrationUI} r0 ""
${If} $0 P<> 0
${IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI} $0 '("Internet Explorer")' ; Replace with your registered application name
${IUnknown::Release} $0 ""
${EndIf}
SectionEnd