目錄
1.1 界面設計用 --NSIS_Dialog_Designer
NSIS是一個開源的軟件安裝包製作程序,在之前的版本,只支持ANSI編碼,從3.0後,開始支持UNICODE編碼,其官方文檔地址爲:https://nsis.sourceforge.io/Main_Page
其主要通過自定義的腳本實現安裝的過程控制、界面的美化、系統信息的檢測等。
1. 工具介紹
在進行實際的使用前,首先介紹幾個軟件,所謂與善其事必先利其器。
1.1 界面設計用 --NSIS_Dialog_Designer
https://nsis.sourceforge.io/NSIS_Dialog_Designer
此軟件可以設計控件的佈局,減少手寫的工作量,在設計完後,如果需要再貼圖美化,可以基於此。
此外如果一些設置控件的命令不清楚是什麼,也可以使用它。
1.2 編輯及嚮導--nisedit2.0.3
nisedit2.0.3 https://sourceforge.net/projects/hmne/
這個軟件很久沒有更新了,目前好像只支持ANSI編碼,不支持UNICODE
但這個軟件有個好處,可以圖形化 製作安裝包,示例。沒有特殊要求,使用它,快捷方便
1.3 控件信息查看 Au3Info.exe
https://www.autoitscript.com/site/autoit/downloads/
主要用於控件ID查看,以觀察控件ID和實際控件的對應關係,以便在NSIS腳本中操控相應的控件。
2. 腳本的結構
我們通過 nis edit軟件自動生成的一個腳本文件來介紹下腳本的主要構成
如下圖:
1) 宏的定義。
腳本支持宏定義。此處定義了版本、名稱等。此外也定義 一些註冊表的路徑信息。註冊表不是必須的。
2) 包含的頭文件。
*.nsh。此處僅僅包含了一個。根據功能的實現,可能需要包含其他的。更多的頭文件在C:\Program Files (x86)\NSIS\Include,此外可能還有第三方插件
3) 界面風格的設置。
例如程序的圖標。界面風格是什麼樣的。軟件自帶的一些界面風格在C:\Program Files (x86)\NSIS\Contrib\UIs中。圖標可以自定義icon文件
4)頁面的定義。
即安裝時需要哪些頁面。此處在設置自定義頁面時改動最多。
5)設置輸出命令和安裝路徑
6) 配置安裝的組件。
以Section SectionEnd爲關鍵字,中間爲要在安裝時進行的動作,比如安裝哪些文件、創建快捷方式、寫註冊表等。
7) 回調函數。
8) 卸載組件。
3. MUI
官方定義了一些宏,通過這些宏,可以控制UI界面的元素,比如上面提及的圖標,自定義頁面等。
詳細的接口在官網: https://nsis.sourceforge.io/Docs/Modern%20UI/Readme.html
除了自定義頁面,會用到如下兩個 自定義函數:
1) MUI_PAGE_CUSTOMFUNCTION_SHOW ,即控制下一個頁面控件的顯示、隱藏、樣式等。
2) !define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit 控制新創建的頁面中控件的顯示、美化等。
在nsis腳本中,代碼的順序是重要的。
3.1 完全自定義頁面
即不依賴於 MUI中已有的頁面,例如 如下MUI中的頁面,而是通過nsdialog插件進程頁面的創建。
代碼示例,以 edit工具嚮導創建的簡單安裝爲例,進行修改。定義 page.1頁面爲第一個頁面,嚮導生成的welcome和licence頁面註釋掉不再使用。
基本頁面創建
; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "nsWindows.nsh"
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
#!define MUI_UI "mod.exe"
; Welcome page
#!insertmacro MUI_PAGE_WELCOME
; License page
#!insertmacro MUI_PAGE_LICENSE "c:\path\to\licence\YourSoftwareLicence.txt"
; Directory page
Page custom Page.1
!insertmacro MUI_PAGE
Function Page.1
/* GetDlgItem $0 $HWNDPARENT 1
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 2
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 3
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1990
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1991
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1992
ShowWindow $0 ${SW_HIDE} */
nsDialogs::Create 1044
Pop $0
${If} $0 == error
Abort
${EndIf}
SetCtlColors $0 "" transparent ;背景設成透明
${NSW_SetWindowSize} $0 588 438 ;改變Page大小
;快速安裝
${NSD_CreateButton} 126u 104u 252 64 ""
/* Pop $btn_in
SkinBtn::Set /IMGID=$PLUGINSDIR\btn_onekey.bmp $btn_in
GetFunctionAddress $3 onClickins
SkinBtn::onClick $btn_in $3 */
;貼背景大圖
/* ${NSD_CreateBitmap} 0 0 100% 100% "" */
/* Pop $BGImage
${NSD_SetImage} $BGImage $PLUGINSDIR\bg.bmp $ImageHandle
GetFunctionAddress $0 onGUICallback
WndProc::onCallback $BGImage $0 ;處理無邊框窗體移動
WndProc::onCallback $BGImage1 $0 ;處理無邊框窗體移動 */
nsDialogs::Show
/* ${NSD_FreeImage} $ImageHandle
${NSD_FreeImage} $ImageHandle1 */
FunctionEnd
上述代碼 僅僅用nsdialog創建一個窗口,並在其中增加一個button,其效果如下,其中紅圈1中爲我們自己添加的button,紅圈2中爲ID爲1038的控件,用AutoIT可以看到這個窗口有很多控件,如果我們不需要這些控件,則可以將其隱藏。
:
控件隱藏
在創建的頁面或者通過custom function 可以實現上述自定義頁面中一些不需要控件信息的隱藏。
如下示例在 custom function onGuiInit中隱藏控件
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
Page custom Page.1
Function onGUIInit
;消除邊框
System::Call `user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},0x9480084C)i.R0`
;隱藏一些既有控件
GetDlgItem $0 $HWNDPARENT 1034
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1035
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1036
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1037
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1038
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1039
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1028
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 2
ShowWindow $0 ${SW_HIDE}
${NSW_SetWindowSize} $HWNDPARENT 588 438 ;改變主窗體大小
FunctionEnd
上述代碼中 1034 \1035等爲控件ID,通過AutoIt可以查看到這些控件的ID,進而通過上述命令隱藏。
GetDlgItem $0 $HWNDPARENT 1028 #解釋:從 $HWNDPARENT指向的窗口中,獲取控件ID 1028的句柄,存放到變量$0中
ShowWindow $0 ${SW_HIDE} # 變量$0不需要定義,是NSIS通用的變量。
隱藏完控件,並消除邊框後的效果如下,可以看到只有我們自己定義的button。根據需要可以添加其他控件,添加控件的命令可以使用第一章介紹的工具NSIS Dialog Designer。
3.2 修改已有頁面
即通過修改NSIS已經定義的頁面 來實現類似自定義頁面的功能,通過在已有頁面前插入自定義函數實現,示例代碼
通過自定義函數 DirPageShow,重新設定安裝路徑頁面的顯示。由宏 MUI_PAGE_CUSTOMFUNCTION_SHOW 來設定自定義函數。
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
#Page custom Page.1
!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirPageShow
!insertmacro MUI_PAGE_DIRECTORY
修改前 安裝路徑的頁面內容如下圖
其中 "Space required 0.0kb" 控件的ID信息如下
我們增加在函數DirPageShow中增加以下內容,可以將 "Space required 0.0kb" 控件進行隱藏
Function DirPageShow
FindWindow $R2 "#32770" "" $HWNDPARENT
GetDlgItem $1 $R2 1023
ShowWindow $1 ${SW_HIDE}
FunctionEnd
隱藏後的效果:
3) 控件的動態顯示
4) 頁面的跳轉方式
5) 按鍵貼皮的製作方法
6)