NSIS实现软件的捆绑安装

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

前几天完成了一个需求——在软件的安装程序完成页面提供了安装其他软件的checkbox选项。

实现效果如下图:


在NSIS界面上添加checkbox,目前我知道有三种方法:
我维护的代码,没有采用MUI2,然而从MUI升到MUI2不是一两行代码能搞定的事情。这次采用了修改ini配置文件的方法实现,其中参考以下两个地方:


finish页面对应的ini为$PLUGINSDIR\ioSpecial.ini,至于$PLUGINSDIR的目录,每次都不一样,在进入finish页面前,用MessageBox MB_OK $PLUGINSDIR阻塞页面并查看一下ioSpecial.ini的结构。
通过观察可以发现,在finish页面,如果没有阅读说明和运行选项时,只有3个控件。每多一项,就多一个控件。
下图是一个配置了阅读说明和运行选项的ioSpecial.ini


所以,要增加一个checkbox控件,只要按照[Field 5]的结构,在finish的PRE函数中,在ini中插入一个相同结构的[Field 6]就可以了!!

好了,可以着手写代码了!

如下代码是在配置了“阅读说明”和“运行”选项的finish界面中,添加了一个“setup”的checkbox。勾选的话,会弹出“select”,否则弹出“not select”。
这份示例代码,做几点说明:
  • checkbox要根据finish页面控件的情况,摆放到适合的位置。
  • finish_show中,把checkbox设置成白底黑字。如果不这样,那么新增的checkbox的背景是灰色的。
  • 如果不想在finish页面显示“运行”和“阅读说明”选项,除了更改代码外,还需要在finish_pre函数中加上一行:WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 3" "Bottom" "85"。因为在这种情况下,field3控件的范围很大,这样会遮住你新增的checkbox,每次要把鼠标移到该位置才能显示。
  • 如果想新增几个控件,注意一下checkbox的位置和控件的总数,然后把Field3的范围改小就可以了。你也可以做一个nsis脚本生成工具,这样的话,如果要更改finish页面上的checkbox数量,就不用手动写nsis代码了。
!define MUI_PAGE_CUSTOMFUNCTION_PRE finish_pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW finish_show
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE finish_leave
!insertmacro MUI_PAGE_FINISH

Function finish_pre
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Settings" "NumFields" "6"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "Type" "CheckBox"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "Text" "setup"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "Left" "120"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "Right" "315"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "Top" "150"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "Bottom" "160"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "State" "1"
FunctionEnd

Function finish_show 
  ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 6" "HWND"
  # 设置白底黑字
  SetCtlColors $0 0x000000 0xFFFFFF
FunctionEnd

Function finish_leave
  Var /GLOBAL finish_page_field6_state
  !insertmacro MUI_INSTALLOPTIONS_READ $finish_page_field6_state "ioSpecial.ini" "Field 6" "State"
  ${If} $finish_page_field6_state == "1"
    MessageBox MB_OK "select"
  ${Else}
    MessageBox MB_OK "not select"
  ${EndIf}
FunctionEnd
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看