简介:面向需要为软件制作专业安装界面的开发者和打包人员,这份Inno Setup自定义安装界面资源包以增强版Inno Setup为基础,内置.NET Framework 4封装,解决默认向导风格单一、品牌呈现不足的问题。包内共136个文件,压缩后约105.4MB;主要包含isl/iss安装脚本、png/psd界面设计图与源文件、dll运行库、图标及辅助exe工具等,脚本与设计资源分离,其中psd源文件便于继续调整视觉细节,dll与exe工具辅助运行与调试,整体便于按需调整。整体结构清晰,code目录下Code.iss为界面核心代码,version.h可集中修改应用名称、公司、版本号等配置;使用时替换app目录下的程序文件和temp目录下的界面图片即可,适合中高级开发者快速定制带品牌形象的安装流程。目前已有1744人学习下载,整套素材覆盖从设计稿到脚本配置的完整链路,能显著减少从零搭建自定义安装界面的工作量。
1. inno setup自定义安装界面:先把最常见的误区拆掉
「inno setup自定义安装界面」这个词,背后是两类人:一类是刚用 inno setup 打包 Windows 桌面软件的开发者,嫌默认向导页太简陋;另一类是公司里负责做安装包的人,想把安装过程做成品牌化的样子,而不是一眼看出是 Inno Setup 的灰底蓝条模板。这个标题能解决的核心问题不是「换张图」,而是搞明白 inno setup 在界面这件事上到底给了你几层可改的空间:文本层、图片层、控件层。有人以为必须学 InstallShield 那种重武器,实际上 Inno Setup 靠脚本就能顶掉大半需求;也有人以为换掉两张 BMP 就是自定义完毕,结果遇到 DPI 缩放、黑边、字体乱码就翻车。这篇就按「先改文本和样式、再换图、深入到控件、最后处理坑」的顺序,把一条不需要第三方打包工具就能走通的落地路径讲清楚。
2. 脚本层原生定制:先在 [Setup] 和 [Messages] 上把界面改出自己的味道
要自定义安装界面,大多数人第一反应是贴图,但我建议先把脚本原生的两个段改明白。原因很简单:Inno Setup 的向导界面有一大半是文字和按钮构成的,把这些字换成你自己的产品名、按钮文案和提示语,安装包的观感立刻就不一样,而且完全不碰图片资源,零维护成本。
2.1 先用 WizardStyle 决定视觉骨架:modern 与 classic 的差别
Inno Setup 6 的向导界面由WizardStyle参数控制。默认值是modern,对应的是 XP/Win7 时代之后流行的「顶部横幅 + 圆角按钮 + 步骤条」风格;另一个可选值是classic,会把界面拉回传统对话框样式,左侧留一块竖图区域,整体更矮更宽。
这两个风格不只是好看与否的区别,它还决定你后续放图的位置和比例:modern风格下大图通常出现在顶部区域,classic风格下大图在左侧。你做自定义界面之前,必须先锁死风格,否则后面配图会反复返工。以下是一组最小脚本:
[Setup] AppName=MyProduct AppVersion=1.0.0 DefaultDirName={autopf}\MyProduct WizardStyle=modern WizardSizePercent=110 WindowResizable=yes WindowWidth=560 WindowHeight=400这段脚本里,WizardStyle=modern选了新式向导骨架;WizardSizePercent=110把整个向导窗口放大了 10%,适合高分辨率屏上觉得窗口太小的用户;WindowResizable=yes允许用户在安装过程中拖拽窗口边缘调整大小,配合WindowWidth和WindowHeight指定初始尺寸。注意,WindowResizable=yes之后,WindowWidth和WindowHeight仍然表示初始尺寸,用户改过的大小会被记住。
2.2 改按钮文字和标题:把「下一步」变成你自己的话
Inno Setup 的按钮文本不在[Setup]段里,而是在[Messages]段。你可以覆盖单个消息,也可以整段重写。最常见的做法是只覆盖几个关键字段:窗口标题、欢迎语、按钮文字和左下角的边注。
[Messages] SetupWindowTitle=安装 MyProduct 1.0.0 WelcomeLabel1=欢迎使用 MyProduct WelcomeLabel2=本向导将引导您完成 MyProduct 的安装。%n%n点击“下一步”继续。 ButtonBack=上一步 ButtonNext=下一步 ButtonInstall=立即安装 ButtonCancel=取消 BeveledLabel=MyProduct 安装程序WelcomeLabel2里的%n是换行符,类似 C 语言的\n。ButtonBack、ButtonNext等字段会直接替换向导底部按钮上的文字。BeveledLabel是窗口左下角那一行小字,很多人忽略它,但这一行最适合放版本号和公司名,能让安装包瞬间显得正规。注意点:如果项目里使用了简体中文语言的默认消息,[Messages]段的覆盖优先级最高,你写什么就显示什么,不需要再去改动语言文件。
2.3 把安装包改得像自家产品:标题、版权、许可协议一起改
只改按钮文字还不够,安装包有三个地方最容易被认出是 Inno Setup:顶部标题栏的「安装 Inno Setup 示例程序」、许可协议页的「许可证协议」字样、以及安装完成页的「正在完成...安装向导」。这三处都可以在[Messages]段覆盖。
[Messages] SetupAppTitle=MyProduct %1 安装程序 SetupWindowTitle=MyProduct %1 - 安装 LicenseLabel=使用 MyProduct 之前,请阅读以下条款 FinishedHeadingLabel=已经完成 MyProduct 的安装 ClickFinish=感谢选择 MyProduct,点击“完成”退出安装程序。SetupAppTitle里的%1是版本号占位符,Inno Setup 会自动替换成AppVersion的值。FinishedHeadingLabel控制完成页的大标题,ClickFinish控制完成按钮上方那段说明。这样改完之后,从标题栏到每一页的文字都已经是你自己的,不仔细看根本认不出是 Inno Setup。这也是「自定义界面」成本最低、收益最明显的一层,适合刚接触 inno setup 打包的初学者先做。
3. 换向导图片:WizardImageFile、尺寸与多语言切换
文字改完了,下一步是换图。很多人自定义安装界面卡在这一步,因为 Inno Setup 对图片有一套自己的规则:它不是把图片「放」到页面上,而是把图片「当作」向导页的某个区域。理解了这个机制,图片相关的参数就好办了。
3.1 大图和小图的分工:不同风格下图片往哪放
Inno Setup 通过两个[Setup]段参数指定图片:WizardImageFile和WizardSmallImageFile。大图出现在欢迎页、安装完成页等主要页面的固定区域;小图出现在安装过程中间的次要页面,比如「正在安装」页的左上角。
我一般会先确定一张大图的基准比例再出图。modern风格下大图是横条区域,建议参考 2:1 到 3:1 之间的横幅比例;classic风格下大图是左侧竖条,比例更接近 1:2。拿不准的时候,先用一张纯色测试图跑一遍,看它被压扁还是被裁剪,再回到作图工具里调整。以下是最小配置:
[Setup] WizardStyle=modern WizardImageFile=assets\banner_main.bmp WizardImageStretch=no WizardSmallImageFile=assets\logo_small.bmpWizardImageFile指定主图;WizardSmallImageFile指定小图;WizardImageStretch=no表示不拉伸图片去填满区域,这个参数后面避坑章节还会细说。Inno Setup 6 默认支持 BMP、JPG、PNG,但我建议统一用 BMP 或 PNG,避免 JPEG 压缩导致的边缘色块在某些页面背景下看起来突兀。
3.2 多语言安装包:按语言切换不同横幅图
如果你的安装包同时发布简体中文和英文,图片也应当跟着语言走。Inno Setup 支持在图片参数后面加语言后缀,用下划线分隔:
[Setup] WizardImageFile=assets\banner_main.bmp WizardImageFile_zh=assets\banner_zh.bmp WizardImageFile_en=assets\banner_en.bmp WizardSmallImageFile=assets\logo_small.bmp WizardSmallImageFile_zh=assets\logo_zh.bmp WizardSmallImageFile_en=assets\logo_en.bmp这里的_zh、_en后缀对应你在[Languages]段里定义的Name值。编译器打包时会识别当前语言,自动选择对应图片。有一个细节容易踩坑:如果某语言的图片缺失,Inno Setup 不会报编译错误,而是直接回退到无后缀的默认图片。这本来是件好事,但也导致很多人编译后没检查,发布出去才发现中文用户看到的还是英文横幅。我每次打包多语言版本时,都会把zh和en两组图片单独列进检查清单。
3.3 高清屏适配:为什么你的图在 4K 屏上发虚
图片替换完成后最常见的抱怨是「我的图在 4K 屏上模糊,而且位置不对」。原因在于:Inno Setup 的向导窗口尺寸是按逻辑像素计算的,系统缩放率 150% 或 200% 时,窗口会放大,但图片区域的物理尺寸也跟着放大,而你的图片还是按 96 DPI 出图的。模糊的本质是图片分辨率不够,不是 Inno Setup 渲染有问题。
对策有两种。第一种是让 Windows 自己拉伸:保持WizardImageStretch=yes,图片会跟着区域拉伸。第二种是准备高分辨率图:如果你知道用户群里高分辨率屏占比高,就把主图按 2 倍尺寸出图,例如目标显示宽度是 300 像素,就做 600 像素宽的图片,并让WizardImageStretch=no,这样在高分屏上会明显更清晰。
提示:
WizardImageStretch只控制 Inno Setup 向导区域里的主图拉伸方式,不影响WizardSmallImageFile。小图比例失配时,更容易因为拉伸而模糊,建议小图只做固定尺寸,不要依赖拉伸。
如果你的安装包需要适配高分屏,还有一个配套参数值得调:WizardSizePercent。这个参数按百分比缩放整个向导窗口。我会在检测到屏幕 DPI 是 150% 的机器上把WizardSizePercent调到 130 左右,配合 2 倍图,视觉上就不会有那种「小图硬撑大区域」的廉价感。这个组合对 inno setup 打包爱好者来说,属于投入小收益大的界面优化。
4. 控件级自定义:VCL风格、自定义页与DPI适配
到了这一层,才算真正意义上的自定义安装界面。文本和图片的改变都是在 Inno Setup 给定的框架里做替换,而控件级自定义允许你往向导里塞自己的页面、自己的按钮、自己的说明文字,甚至给整套界面换皮肤。
4.1 用 VCL 风格文件整体换肤:一条让整个向导变样的捷径
Inno Setup 6 的向导本身就是用 VCL 构建的,所以它支持加载.vsf格式的 VCL 风格文件。一个.vsf文件里定义了所有控件的配色、边框、按钮样式,加载它之后,整个向导的观感会彻底改变,不再只是换图。
常见做法是借助开源项目 VCL Styles for Inno Setup 提供的运行时 DLL,以LoadVCLStyle方式在启动时加载风格文件。典型脚本如下:
[Code] procedure LoadVCLStyle(APath: string); external 'LoadVCLStyle@files:VclStylesInno.dll stdcall'; function InitializeSetup(): Boolean; begin ExtractTemporaryFile('style_dark.vsf'); LoadVCLStyle(ExpandConstant('{tmp}\style_dark.vsf')); Result := True; end;逻辑说明:LoadVCLStyle声明为外部函数,指向随安装包一起打包的VclStylesInno.dll;ExtractTemporaryFile把.vsf释放到临时目录,再交给LoadVCLStyle加载。参数是风格文件的完整路径。注意,VclStylesInno.dll必须通过[Files]段用Flags: dontcopy打进安装包,否则运行时找不到 DLL。.vsf风格文件可以从 VCL Styles 社区相关的项目里下载,也可以自己用 Delphi 的 VCL Styles Builder 制作。这个方案的成本是:皮肤文件会影响整个界面的控件绘制,某些第三方控件或自定义页面里的控件可能不吃皮肤,需要在真机上逐个页面过一遍。
4.2 在向导里插入你自己的品牌页:CreateCustomPage 的用法
换肤是全局改观,但产品信息、用户协议确认、环境检查这类内容,最好还是以独立页面的形式插在向导流程里。Inno Setup 的CreateCustomPage函数就是干这个的:
[Code] var InfoPage: TWizardPage; InfoText: TNewStaticText; procedure InfoPage_Activate(Page: TWizardPage); begin InfoText.Caption := '产品版本:1.0.0' + #13#10 + '安装路径:' + ExpandConstant('{app}') + #13#10 + '请确认以上信息无误后继续。'; end; procedure InitializeWizard; begin InfoPage := CreateCustomPage( wpWelcome, '安装前确认', '请确认产品版本和安装目录'); InfoText := TNewStaticText.Create(InfoPage); InfoText.Parent := InfoPage.Surface; InfoText.Left := ScaleX(16); InfoText.Top := ScaleY(16); InfoText.Width := InfoPage.SurfaceWidth - ScaleX(32); InfoText.Height := ScaleY(80); InfoText.WordWrap := True; end;CreateCustomPage的第一个参数是插入位置,wpWelcome表示插在欢迎页之后;第二个和第三个参数分别是对应页面顶部的大标题和副标题。TWizardPage是页面对象,控件要挂到它的Surface上而不是页面上。TNewStaticText是 Inno Setup 6 官方提供的文本控件,Left、Top、Width、Height负责布局,WordWrap := True让长文本自动换行。InfoPage_Activate是这个页面每次被激活时触发的事件,适合在这里动态刷新文案,比如从注册表读出已安装路径再展示。
4.3 让控件在 150% 缩放下不跑位:ScaleX 与 ScaleY 是底线
自定义控件最常见的翻车现场是:开发机上看着完美,一放到同事的 150% 缩放的笔记本上,按钮压到边界外面去了。原因不是 Inno Setup 的问题,而是你没有按 DPI 缩放控件坐标。
Inno Setup 6 提供的ScaleX和ScaleY就是干这个的。上一节代码里我已经把Left写成ScaleX(16)、Top写成ScaleY(16),含义是:无论系统缩放率是多少,都按 16 个逻辑像素的物理距离来布局。如果你直接写Left := 16,在高分屏下这个坐标不会跟着放大,控件就会挤在角落。
InfoText.Left := ScaleX(16); InfoText.Top := ScaleY(16); InfoText.Width := InfoPage.SurfaceWidth - ScaleX(32); InfoText.Height := ScaleY(80); BtnConfirm := TNewButton.Create(InfoPage); BtnConfirm.Parent := InfoPage.Surface; BtnConfirm.Left := InfoPage.SurfaceWidth - ScaleX(120); BtnConfirm.Top := InfoPage.SurfaceHeight - ScaleY(48); BtnConfirm.Width := ScaleX(100); BtnConfirm.Height := ScaleY(32); BtnConfirm.Caption := '我已确认';这段脚本里,按钮的Left用SurfaceWidth - ScaleX(120)计算,意思是让按钮离右边保持 120 逻辑像素的间距,Top同理,离底部 48 逻辑像素。这样做的好处是窗口尺寸无论怎么变,按钮都锚定在右下角。经验之谈:所有自定义页面里的控件坐标,只要涉及固定数值,一律包一层ScaleX/ScaleY;凡是涉及页面宽高的,一律用Page.SurfaceWidth和Page.SurfaceHeight去减,不要写死像素。
这样的控件级自定义做完之后,安装流程就不再是「Inno Setup 标准向导 + 换了张图」,而是「你的安装向导 + 你的品牌页 + 你的按钮」。配合 inno setup 打包时常用的/SILENT参数,甚至可以做出完全无声的定制安装体验。
5. 自定义界面避坑指南:四个最常见问题的原因和修复
界面改得越深,踩的坑越多。这一章把我在自定义 inno setup 安装界面过程中反复遇到的四个问题整理成「现象 → 原因 → 解决」三条式记录,每条都是可以直接照抄的排错经验。
5.1 图片变形或出现黑边:WizardImageStretch 到底该怎么设
现象:主图放进向导后,要么被拉伸得面目全非,要么旁边出现一大块黑色背景。
原因:图片本身的宽高比和 Inno Setup 向导预留区域的宽高比不一致。设WizardImageStretch=yes时,图片会被强行拉伸填满区域,比例差太多就变形;设WizardImageStretch=no时,图片保持原始比例,剩余的区域就用BackColor参数指定的颜色填充,默认是黑色,于是出现黑边。
解决:先确定你的向导风格,然后按风格出一张比例接近的图。modern风格下的横幅区域接近 2.5:1 到 3:1,classic风格下的左侧区域接近 1:2 到 1:2.5,在这两个范围里出图,WizardImageStretch=no基本不会看到明显黑边。如果已经有一张非标准比例的图不想重做,就把WizardImageStretch设为yes,同时把图的背景设计成纯色,拉伸后的变形感会小很多。注意,BackColor参数需要搭配WizardImageBackColor=yes才会生效,否则图片区域仍按黑色处理。
5.2 DPI 缩放后自定义页面控件错位:坐标没有包 ScaleX/ScaleY
现象:自定义页面在 100% 缩放的电脑上正常,换到 150% 缩放的电脑上,按钮跑到页面外,文本被截断。
原因:直接给Left、Top、Width、Height写了固定像素值。Windows 缩放后,物理像素变多,但固定值不会变,控件位置自然偏移。
解决:所有固定数值坐标一律套ScaleX()和ScaleY()。这不仅是按钮问题,凡是你创建的TNewStaticText、TNewButton、TNewCheckBox、TNewEdit都要遵循这个规则。除了坐标,字号也要注意:Inno Setup 默认会按系统 DPI 自动缩放标准页面的字体,但自定义控件里的字体缩放表现不稳定,建议在InitializeWizard里显式设置InfoText.Font.Size := 9之类,并配合ScaleY控制高度。
5.3 中文显示成方框或乱码:编码和字体两头堵
现象:自定义页面的中文标题显示成一个个方块,或者按钮上的中文变成问号。
原因分两种。第一种是脚本文件本身编码不对:Inno Setup 6 默认按 UTF-8 处理.iss文件,但如果你用旧版编辑器保存成了 GB2312 或 ANSI,中文就会被错误解析。第二种是系统缺少对应字体:某些精简版 Windows 或服务器系统没有安装微软雅黑,而自定义页面里指定的字体又是「微软雅黑」,系统找不到就回退到默认字体,方框就出现了。
解决:.iss文件统一保存为「UTF-8 带 BOM」格式,不要用无 BOM 的 UTF-8。如果项目里同时存在多个.iss片段,还要确认没有混入 GBK 编码的包含文件。字体问题优先用TNewStaticText的Font.Name指定「宋体」或「Microsoft YaHei」这种系统自带字体,不要用产品自定义字体,否则就要在安装包里顺便带上字体文件并通过[Files]安装,维护成本高得多。
5.4 VCL 风格皮肤导致误报或控件闪烁:DLL 与皮肤文件的兼容性问题
现象:加载 VCL 风格后,整个向导变好看了,但杀毒软件报毒,或者切换页面时部分控件闪烁、卡顿。
原因:VclStylesInno.dll是一个运行时代码注入型的 DLL,本身容易触发启发式查杀;同时.vsf风格文件对部分标准控件的绘制 hook 和 Inno Setup 6 的某些新控件不完全兼容,页面切换时会重复绘制背景,表现为闪烁。
解决:不要改动 VCL 风格默认 DLL,优先使用开源项目官方发布的构建版本,不要为了功能去修改 DLL。其次,杀毒误报靠提交误报申诉和代码签名解决,SetupIconFile、SignTool两个参数配合给安装包签名,误报率会显著下降。闪烁问题如果出现在某个特定.vsf上,直接换一个风格文件,大多数情况下一换就好,这不是 Inno Setup 的 bug,是风格文件里针对已过时控件的绘制代码在作怪。
6. 进阶技巧:品牌启动页 + 静默移交标准向导,以及我最后补的一个习惯
如果你连安装程序启动后的第一眼都觉得不够品牌化,那可以把标准向导再往后推一层:先显示一个你自己画的全屏品牌页,再静默启动 Inno Setup 安装流程。这是我在做企业级安装包时常用的方案,思路是让品牌页接管「第一印象」,Inno Setup 接管「安装逻辑」。
做法是写一个小的引导程序(C#、VB.NET 或 Delphi 都行),它在启动时全屏显示品牌图,过两秒后调用真正的setup.exe,并传静默参数:
var p = Process.Start( "setup.exe", "/VERYSILENT /SUPPRESSMSGBOXES /NORESTART"); p.WaitForExit(); splashForm.Close();/VERYSILENT让 Inno Setup 不显示任何界面进度,只执行安装;/SUPPRESSMSGBOXES抑制错误弹窗;/NORESTART不触发重启。这样用户看到的全程都是你的品牌页,安装完成后品牌页退出。这个方案有一个明显边界:用户在整个安装过程中看不到进度条,所以适合安装时间短、或者对进度不敏感的内部工具型软件;如果安装耗时很长,还是要用CreateCustomPage加TNewProgressBar自己做进度页。我现在的习惯是:每次改完界面,先跑一份「基础版 + 完整安装流程」的打包,确认所有页面在 100% 和 150% 两种缩放下都不跑位,再去碰皮肤和启动页,这样就算翻车也容易定位。这个顺序帮我省掉了很多来回排查的时间,希望帮到你。
本文还有配套的精品资源,点击获取