如何使用 NSIS 将程序添加到 "Open With" 菜单

How to use NSIS to add a program to the "Open With" menu

我有一个程序可以打开两种类型的文件:.animera.png。我希望该程序成为 .animera 的默认程序,但不是 .png 的默认程序。我有这个用于处理 .animera 个文件:

WriteRegStr HKCR '.animera' '' 'AnimeraSprite'
WriteRegStr HKCR 'AnimeraSprite' '' 'Animera Sprite'
WriteRegStr HKCR 'AnimeraSprite\shell' '' 'open'
WriteRegStr HKCR 'AnimeraSprite\shell\open\command' '' '"$INSTDIR\bin\Animera.exe" open "%1"'
WriteRegStr HKCR 'AnimeraSprite\shell\edit\command' '' '"$INSTDIR\bin\Animera.exe" open "%1"'
WriteRegStr HKCR 'AnimeraSprite\DefaultIcon' '' '$INSTDIR\bin\Animera.exe,1'

似乎有十几种方法可以做到这一点,但上面的代码片段非常有效。悬停显示文件类型为“Animera Sprite”,显示图标并双击打开程序。我为 .png 尝试了类似的东西,除了我不希望这个程序成为默认的 png 查看器。我只是希望用户可以选择使用这个程序。这是我的尝试:

WriteRegStr HKCR '.png\OpenWithProgids' 'AnimeraPNG' ''
WriteRegStr HKCR 'AnimeraPNG\shell' '' 'open'
WriteRegStr HKCR 'AnimeraPNG\shell\open\command' '' '"$INSTDIR\bin\Animera.exe" open "%1"'

右键单击 png 文件然后将鼠标悬停在“打开方式”上不会在列表中显示该程序。那么我该如何实现呢?

看起来您做的一切都正确,但在某些时候(Windows 8?)Windows 开始需要更多信息才能显示应用程序,而 MSDN 从未更新过。

您至少需要在版本信息或未记录的注册表项中提供公司名称和应用程序名称:

RequestExecutionLevel User
Name "Test"
OutFile "AnimeraPNG.exe"


!include "LogicLib.nsh"
!include "FileFunc.nsh"
Function .onInit
${GetParameters} [=10=]
${If} [=10=] != ""
    MessageBox mb_ok "File:[=10=]"
    Quit
${EndIf}
FunctionEnd

Section
WriteRegStr HKCU 'Software\Classes\.png\OpenWithProgids' 'AnimeraPNG' ''  ; WinXP+
WriteRegStr HKCU 'Software\Classes\AnimeraPNG\shell' '' 'open'
WriteRegStr HKCU 'Software\Classes\AnimeraPNG\shell\open\command' '' '"$exepath" "%1"'
SectionEnd


!if 1
VIProductVersion 1.2.3.4
VIAddVersionKey /LANG=0 "CompanyName" "AnimeraPNG fake company"
VIAddVersionKey /LANG=0 "ProductName" "AnimeraPNG product"
VIAddVersionKey /LANG=0 "FileDescription" "AnimeraPNG Application"
!else
Section
WriteRegStr HKCU 'Software\Classes\AnimeraPNG\Application' 'ApplicationName' 'AnimeraPNG'
WriteRegStr HKCU 'Software\Classes\AnimeraPNG\Application' 'ApplicationCompany' 'AnimeraPNG fake company'
;WriteRegStr HKCU 'Software\Classes\AnimeraPNG\Application' 'ApplicationIcon' '$exepath'
;WriteRegStr HKCU 'Software\Classes\AnimeraPNG\Application' 'ApplicationDescription' '...'
;WriteRegStr HKCU 'Software\Classes\AnimeraPNG\Application' 'AppUserModelId' '...'
SectionEnd
!endif

或者将其添加为 extra verb:

WriteRegStr HKCU 'Software\Classes\SystemFileAssociations\.png\shell\AnimeraPNG\command' '' '"$exepath" "%1"' ; WinXP+