NSIS製作安裝軟件過程

目錄

1. 工具介紹

1.1  界面設計用 --NSIS_Dialog_Designer

1.2  編輯及嚮導--nisedit2.0.3 

 1.3 控件信息查看 Au3Info.exe 

 2. 腳本的結構

  1) 宏的定義。

  2) 包含的頭文件。

  3) 界面風格的設置。

 4)頁面的定義。

   5)設置輸出命令和安裝路徑

   6) 配置安裝的組件。

  7)  回調函數。

  8) 卸載組件。

3. MUI 

 3.1  完全自定義頁面

 基本頁面創建

控件隱藏

3.2  修改已有頁面


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)  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章