windows - 如何使用NSIS向 "Open With"菜单添加程序

标签 windows windows-10 registry nsis

我有一个程序可以打开两种类型的文件:.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} $0
${If} $0 != ""
    MessageBox mb_ok "File:$0"
    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+

关于windows - 如何使用NSIS向 "Open With"菜单添加程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62769041/

相关文章:

windows - 以已知速率将数据发送到 USB 端口

windows - 找出环境变量是否包含子字符串

c# - 如何处理 "The notification platform is unavaible",系统异常

c# - 如何使用所有可用的声音?

windows - RegOpenKeyEx 在失败时返回什么错误代码?

c++ - 未定义对 cv::Tracker::update 的引用

windows - Windows 上的 imapclient 错误

python - Pip 安装 shapely giving "python setup.py egg_info"失败,错误代码 1 错误

c++ - 打印名称、类型和注册表数据

windows - 在 PowerShell 中,如何从所有 SID 的 HKEY_Users 中提取文件?