工作中接到任务需要参考某个软件制作安装包,于是就接触到了NSIS脚本,因为时间短,经验不足,遇到了很多坑,
记录一下以及对应的解决方式:
1、Label的刷新问题:在透明状态下,无法刷新,所有文字都重叠显示了。
NSIS本身给出了官方解决方法:http://nsis.sourceforge.net/Refreshing_labels_after_color_change,就是要刷新的地方先Hide 再Show出来
但是我在使用的时候发现,如果在另一个线程中(Timer触发的事件)频繁更新,就会频繁导致安装过程中崩溃。解决方法是设置label的底色和背景色接近,而不是透明
SetCtlColors $Lbl_Info 0xFFFFFF 0x111521(底色)
2、线程中(Timer触发事件)创建软件的快捷方式,真的是很无语,花了很多时间找原因,也没看到相关的说明。只能独立出来这部分功能
3、修改NSIS内部的UI。如果是自定义界面的话,就可能会涉及改变窗口大小的问题,一般情况下是不会有问题(不改变,NSIS的默认UI放在"%NSIS_Install_DIR%\Contrib\UIs"中,其中常常见到的创建自定义窗体的1018,1044都在此路径的modern.exe中)。但是在不修改默认大小的情况下,我们创建的界面小于默认尺寸,我们的界面就不会居中在桌面中,同样弹出对话框就不会居中在我们的自定义界面中。所以需要通过工具ResHacker修改对应dialog的高宽,和我们自定义的UI界面大小一致或接近注意里面的单位不是像素哦。
引用外部自定义UI方式:
;使用自定义的UI
!define MUI_UI "UI\mod.exe"
另一种方式更简单灵活些,用默认的modern.exe
获取屏幕大小然后自己确定位置
System::Call 'user32::GetSystemMetrics(i 0) i .r0' ;宽
System::Call 'user32::GetSystemMetrics(i 1) i .r1' ;高
根据自己的需要处理$0 $1然后设置显示的坐标位置
${NSW_SetWindowPos} $HWNDPARENT $0 $1
4、 在安装过程中,如果强制关闭,会弹出是否终止安装的确认窗口,这个时候只要去掉 !define MUI_ABORTWARNING ,然后再关闭中加入我们自己的业务逻辑即可。
关闭安装程序自身的方法:SendMessage $hwndparent ${WM_CLOSE} 0 0 ;关闭