如何在 Inno Setup 中关联多种文件格式

时间:2022-11-07 13:09:02

Inno Setup 是一款十分强大的 Windows 安装程序制作软件,可以通过编写并编译 iss 脚本来创建安装包。之前都是直接将 Pyinstaller 生成的文件夹压缩为 zip 格式来发布,但是这样做存在一些问题,比如没有桌面和开始菜单快捷方式,没法关联支持的文件格式。而通过 Inno Setup 生成的安装包可以帮我们解决这些问题。

问题解决

关联文件格式

要想实现关联文件格式的功能,我们需要修改注册表,先来观察一下与 mp3 格式相关的注册表格式:

如何在 Inno Setup 中关联多种文件格式

可以看到里面有一个名为 WMP11.AssocFile.MP3,这个键说明 Win11 的媒体播放器支持 mp3 格式,我们只需在这里面创建一个新的键,比如 Groove.AssocFile.mp3,就能向系统声明我们的软件也支持 mp3 格式。

当我们把光标移到 mp3 文件上时,工具提示上会显示一些文件信息,比如项目类型、大小和创建时间,我们同样可以通过操作注册表来修改项目类型信息。

如何在 Inno Setup 中关联多种文件格式

由于我们先前声明的键名是 Groove.AssocFile.mp3,所以可以在 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes 下新建一个名为 Groove.AssocFile.mp3 的项,并创建一个键名为空,键值为 MP3 Audio File 的键值对,这样当我们把 mp3 文件关联到自己的软件上时,工具提示上的项目类型显示的就会是 MP3 Audio File 而非 MP3 文件

如何在 Inno Setup 中关联多种文件格式

接下来在 Groove.AssocFile.mp3 中新建 DefaultIcon 项,新建一个值为 图标文件路径,0 的键值对,这样就能自定义文件图标了。

如何在 Inno Setup 中关联多种文件格式

最后当我们双击文件时,系统会通过使用默认的关联程序来打开此文件。假设我们已经关联了 mp3 文件类型,要想让系统使用我们的程序打开这个文件,就需要向系统说明可执行文件的路径,同时这个可执行文件要接受一个被打开的文件路径参数。只需在 Groove.AssocFile.mp3 下新建 shell\open\command 项,添加值为 "可执行文件路径" "%1" 的键值对即可。

如何在 Inno Setup 中关联多种文件格式

可以在 iss 脚本中添加下述代码来实现上述过程:

#define MyAppAssocName "Groove.AssocFile"

[Registry]
; .mp3 format
Root: HKA; Subkey: "Software\Classes\.mp3\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}.mp3"; ValueData: ""; Flags: uninsdeletevalue
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocName}.mp3"; ValueType: string; ValueName: ""; ValueData: "MP3 Audio File"; Flags: uninsdeletekey
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocName}.mp3\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyFileExtensionIcon},0"
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocName}.mp3\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""

Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".myp"; ValueData: ""

如果想要添加更多的关联文件格式,只需重复 [Registry]mp3 的写法即可,比如关联 flac 格式:

; .flac format
Root: HKA; Subkey: "Software\Classes\.flac\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}.flac"; ValueData: ""; Flags: uninsdeletevalue
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocName}.flac"; ValueType: string; ValueName: ""; ValueData: "Free Lossless Audio Codec File"; Flags: uninsdeletekey
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocName}.flac\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyFileExtensionIcon},0"
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocName}.flac\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""

修改打开方式菜单中的名字

如果只完成了上述步骤,会发现打开方式菜单中显示的是可执行文件的文件名,比如 Groove.exe,如果想改为下图所示的 Groove Music Player,仍需要修改注册表。

如何在 Inno Setup 中关联多种文件格式

可执行文件名.exe 项中添加键名为 FriendlyAppName,值为 Groove Music Player 的键值对即可。

如何在 Inno Setup 中关联多种文件格式

上述过程对应的 iss 代码是:

Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}"; ValueType: string; ValueName: ""; ValueData: "Groove Music Player"
Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}"; ValueType: string; ValueName: "FriendlyAppName"; ValueData: "Groove Music Player"

后记

至此,在 Inno Setup 中添加文件关联的方式就介绍完毕了,上述过程提及的安装包可以从 https://github.com/zhiyiYo/Groove/releases/latest 下载,以上~