NSIS 之 NsDialogs 常見問題解答

水晶石發表於2024-07-20

如何啟用/禁用控制元件

使用標準 NSIS EnableWindow 命令。

NSDialogs 允許您彈出透過 ${NSD_Create*} 建立的控制元件的 hwnd (控制代碼)。EnableWindowhwnd 作為其引數之一。透過它,您可以輕鬆啟用/禁用控制元件。

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var hwnd
var button

Function pre
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateCheckbox} 0 0 50% 6% "Enable button below"
Pop $hwnd
${NSD_OnClick} $hwnd EnDisableButton

${NSD_CreateButton} 25% 25% 50% 50% "Hello World"
Pop $button
EnableWindow $button 0 # start out disabled

nsDialogs::Show
FunctionEnd

Function
EnDisableButton
Pop $hwnd
${NSD_GetState} $hwnd $0
${If} $0 == 1
EnableWindow $button 1
${Else}
EnableWindow $button 0
${EndIf}
FunctionEnd

Section
""
SectionEnd

如何顯示/隱藏控制元件

使用標準 NSIS ShowWindow 命令。

NSDialogs 允許您彈出透過 ${NSD_Create*} 建立的控制元件的 hwnd (控制代碼)。ShowWindow將 hwnd 作為其引數之一。透過它,您可以輕鬆顯示/隱藏控制元件。

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var hwnd
var button

Function pre
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateCheckbox} 0 0 50% 6% "Show button below"
Pop $hwnd
${NSD_OnClick} $hwnd EnDisableButton

${NSD_CreateButton} 25% 25% 50% 50% "Hello World"
Pop $button
ShowWindow $button ${SW_HIDE} # start out hidden

nsDialogs::Show
FunctionEnd

Function
EnDisableButton
Pop $hwnd
${NSD_GetState} $hwnd $0
${If} $0 == 1
ShowWindow $button ${SW_SHOW}
${Else}
ShowWindow $button ${SW_HIDE}
${EndIf}
FunctionEnd

Section
""
SectionEnd

如何建立一個文字居中的標籤

文字居中 - 無論控制元件的大小如何,文字始終居中顯示,這通常對於展示目的非常有用。使標籤的文字居中對齊很簡單,使用 ${NSD_AddStyle} 命令新增 ${SS_CENTER} 樣式即可。

!include "nsDialogs.nsh"

OutFile "$%temp%\temp.exe"

var dialog
var hwnd
var null

Page custom Test

Function Test
nsDialogs::Create 1018
Pop $dialog

${NSD_CreateLabel}
0 0 100% 20% "This line will be centered.$\nAnd so will this line."
Pop $hwnd
${NSD_AddStyle} $hwnd ${SS_CENTER}

nsDialogs::Show
FunctionEnd

Section
SectionEnd

如何建立多行編輯(文字)控制元件

雖然多行是控制元件的一個樣式,但對於編輯(文字)控制元件來說,它是少數幾種樣式之一,無法在控制元件建立後設定,因此無法使用 ${NSD_AddStyle}。

相反,您需要手動建立控制元件:

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var hwnd

Function pre
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateText} 0 0 100% 40% "This is NOT a$\r$\nmulti-line$\r$\nedit control"
Pop $hwnd

nsDialogs::CreateControl EDIT \
"${__NSD_Text_STYLE}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}" \
"${__NSD_Text_EXSTYLE}" \
0 50% 100% 40% \
"This IS a$\r$\nmulti-line$\r$\nedit control"
Pop $hwnd

nsDialogs::Show
FunctionEnd

Section
""
SectionEnd

或者,更簡潔的方法是使用 NsDialogs_CreateTextMultiline 標頭檔案:

!include "nsDialogs.nsh"
!include "nsDialogs_createTextMultiline.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var hwnd

Function pre
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateText} 0 0 100% 40% "This is NOT a$\r$\nmulti-line$\r$\nedit control"
Pop $hwnd

${NSD_CreateTextMultiline} 0 50% 100% 40% "This IS a$\r$\nmulti-line$\r$\nedit control"
Pop $hwnd

nsDialogs::Show
FunctionEnd

Section
""
SectionEnd

如何建立文字密碼控制元件

請參閱 nsDialogs 文件 - 密碼控制元件是預設支援的控制元件之一;${NSD_CreatePassword}

如何設定文字密碼控制元件使用的字元

預設情況下,文字密碼控制元件將使用星號(****)作為密碼字元來掩蓋文字(當'XPStyle off'時),或者使用圓點(••••)(當'XPStyle on'時)。您可以使用帶有 EM_SETPASSWORDCHAR 標誌的 SendMessage 來更改此字元。

密碼字元由其 ASCII 或 UNICODE 碼索引標識;請注意,您在安裝程式中使用的字型可能不支援您希望使用的字元。

注意:如果將密碼字元設定為 0(零),文字將不會被掩蓋!您可以利用這一點在文字密碼控制元件中切換文字的可見和掩蓋狀態。另請參閱如何在文字密碼控制中隱藏/顯示密碼的條目。

!include "nsDialogs.nsh"

!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var hwnd

Function pre
nsDialogs::Create 1018
Pop $dialog
${NSD_CreatePassword} 0 0 50% 8% "This is a password field"
Pop $hwnd
SendMessage $hwnd ${EM_SETPASSWORDCHAR} 149 0
# 在 ASCII 或 Unicode 編碼中,149 指的是中等大小的圓點
nsDialogs::Show
FunctionEnd

Section
""
SectionEnd

如何在文字密碼控制元件中隱藏/顯示密碼

透過使用帶有 EM_SETPASSWORDCHAR 標誌的 SendMessage 設定,透過將字元指定為 0(零),您可以讓密碼可見,而透過指定非零字元使密碼再次不可見。

注意:更改掩碼字元後,必須強制重繪密碼控制元件。通常是透過隱藏然後使用 ShowWindow 顯示控制元件來完成。

!include "nsDialogs.nsh"

!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var hwnd
var passwordControl

Function pre
nsDialogs::Create 1018
Pop $dialog

${NSD_CreateCheckbox} 0 0 25% 8% "Show password"
Pop $hwnd
${NSD_OnClick} $hwnd ShowPassword

${NSD_CreatePassword} 0 10% 50% 8% "This is a password field"
Pop $passwordControl

nsDialogs::Show
FunctionEnd

Function
ShowPassword
Pop $hwnd
${NSD_GetState} $hwnd $0
ShowWindow $passwordControl ${SW_HIDE}
${If} $0 == 1
SendMessage $passwordControl ${EM_SETPASSWORDCHAR} 0 0
${Else}
SendMessage $passwordControl ${EM_SETPASSWORDCHAR} 42 0
${EndIf}
ShowWindow $passwordControl ${SW_SHOW}
FunctionEnd

Section
""
SectionEnd

注意:在啟用 'XPStyle on' 的情況下,如果要重置ANSI構建中看到的“粗點”字元,不能使用標準的SendMessage(底層使用 SendMessageA),因為它是一個 Unicode 字元。可以使用 System 外掛呼叫 SendMessageW 函式:

/* 9679是粗點字元 */

System::Call "user32::SendMessageW(i $hwnd, i ${EM_SETPASSWORDCHAR}, i 9679, i 0)"

如何建立僅數字的文字控制元件

請參閱 nsDialogs 文件 - 僅限數字的控制元件是預設支援的控制元件之一;${NSD_CreateNumber}

如何建立只讀文字控制元件

文字控制元件的只讀狀態可以使用帶有 EM_SETREADONLY 標誌的 SendMessage 來設定。

請注意,只讀的編輯(文字)控制元件與禁用的文字控制元件不同。禁用的文字控制元件將其文字顯示為灰色,而只讀的文字控制元件則保持黑色,並顯示在淺灰色背景上。此外,禁用的多行文字控制元件無法滾動。而只讀的多行文字控制元件則可以滾動。

!include "nsDialogs.nsh"

!include "winmessages.nsh"

!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var hwnd
var textControl

Function pre
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateCheckBox} 0 0 50% 6% "Set text field below read-only"
Pop $hwnd
${NSD_OnClick} $hwnd SetReadonly
${NSD_CreateText} 0 12% 100% 8% "Hello World"
Pop $textControl

nsDialogs::Show
FunctionEnd

Function
SetReadonly
Pop $hwnd
${NSD_GetState} $hwnd $0
SendMessage $textControl ${EM_SETREADONLY} $0 0
FunctionEnd

Section
""
SectionEnd

單選按鈕 (Radio buttons)

單選按鈕基本用法

!include nsDialogs.nsh
Page Custom MyPageCreate MyPageLeave

Var StationChoice

Function MyPageCreate
nsDialogs::Create 1018
Pop $0
${NSD_CreateFirstRadioButton}
0 0 40% 6% "NPR"
Pop $1
SendMessage $1 ${BM_CLICK} "" "" ; Must select a default
${NSD_CreateAdditionalRadioButton} 0 12% 40% 6% "BBC"
Pop $2
${IfThen} $StationChoice
== "BBC" ${|} SendMessage $2 ${BM_CLICK} "" "" ${|}
nsDialogs::Show
FunctionEnd

Function
MyPageLeave
${NSD_GetChecked} $1 $3
${If} $3
<> ${BST_UNCHECKED}
StrCpy $StationChoice "NPR"
${Else}
StrCpy $StationChoice "BBC"
${EndIf}
FunctionEnd

Section
DetailPrint
"Turning the dial to $StationChoice"
SectionEnd

根據單選按鈕的變化更新頁面

!include nsDialogs.nsh

Page Custom MyPageCreate

Function MyPageCreate
nsDialogs::Create 1018
Pop $0

; 組1
${NSD_CreateFirstRadioButton} 0 0 50% 12u "NPR"
Pop $1
${NSD_OnClick} $1
onStationChanged
${NSD_CreateAdditionalRadioButton} 0 14u 50% 12u "BBC"
Pop $2
${NSD_OnClick} $2
onStationChanged
${NSD_CreateLabel} 0 30u 80% 12u ""
Pop $3
SendMessage $1 ${BM_CLICK} "" "" ; 必須選擇一個預設選項

; 組2
${NSD_CreateFirstRadioButton} 0 50u 50% 12u "FM"
Pop $0 ; 僅用於演示,稍後不需要控制代碼
${NSD_CreateAdditionalRadioButton} 0 64u 50% 12u "AM"
Pop $0 ; 僅用於演示,稍後不需要控制代碼
SendMessage $0 ${BM_CLICK} "" "" ; 必須選擇一個預設選項

nsDialogs::Show
FunctionEnd

Function
onStationChanged
Pop $0
${NSD_GetChecked} $1 $0
${If} $0
<> ${BST_UNCHECKED}
${NSD_SetText} $3
"America, f*(# yeah!" ;
${Else}
${NSD_SetText} $3
"保持冷靜,繼續前行" ; Keep Calm and Carry On
${EndIf}
FunctionEnd

如何建立兩組 RadioButton

使用 ${NSD_AddStyle} 向每組的第一個單選按鈕新增 WS_GROUP 樣式。在 Windows 的 UI 處理中,如果沒有定義組啟動器,所有單選按鈕都被視為同一組的一部分。

因此,要建立兩個各有兩個單選按鈕的組,必須為每組指定一個組啟動器,否則第三和第四個單選按鈕將被視為第一組的一部分。

使用 ${NSD_AddStyle} 設定組啟動器很簡單,使用以下程式碼:

${NSD_AddStyle} $hwnd ${WS_GROUP} # WS_GROUP 定義在 winmessages.nsh 中

示例:

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var hwnd

Function pre
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateRadioButton}
0 0 40% 6% "組 1,單選按鈕 1"
Pop $hwnd
${NSD_AddStyle} $hwnd ${WS_GROUP}
${NSD_CreateRadioButton}
0 12% 40% 6% "組 1,單選按鈕 2"
Pop $hwnd

${NSD_CreateRadioButton}
50% 0 40% 6% "組 2,單選按鈕 1"
Pop $hwnd
${NSD_AddStyle} $hwnd ${WS_GROUP}
${NSD_CreateRadioButton}
50% 12% 40% 6% "組 2,單選按鈕 2"
Pop $hwnd

nsDialogs::Show
FunctionEnd

Section
""
SectionEnd

如何輕鬆處理單選按鈕的選擇

通常,你不希望為每個單選按鈕指定單獨的 OnClick 函式...

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var hwnd

Function pre
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateRadioButton} 0 0 40% 6% "Group 1, Radio 1"
Pop $hwnd
${NSD_AddStyle} $hwnd ${WS_GROUP}
${NSD_OnClick} $hwnd Group1Radio1Click
${NSD_CreateRadioButton} 0 12% 40% 6% "Group 1, Radio 2"
Pop $hwnd
${NSD_OnClick} $hwnd Group1Radio2Click

nsDialogs::Show
FunctionEnd

Function
Group1Radio1Click
Pop $hwnd
MessageBox MB_OK "onClick:Group1Radio1"
FunctionEnd
Function
Group1Radio2Click
Pop $hwnd
MessageBox MB_OK "onClick:Group1Radio2"
FunctionEnd

Section
""
SectionEnd

但是唯一明顯的替代方法似乎是將每個單選按鈕放在不同的變數中,並在回撥函式呼叫時將堆疊上的 hwnd 與該變數進行比較。

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var hwnd

var Group1Radio1
var Group1Radio2

Function pre
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateRadioButton}
0 0 40% 6% "組 1, 單選 1"
Pop $Group1Radio1
${NSD_AddStyle} $Group1Radio1 ${WS_GROUP}
${NSD_OnClick} $Group1Radio1
RadioClick
${NSD_CreateRadioButton} 0 12% 40% 6% "組 1, 單選 2"
Pop $Group1Radio2
${NSD_OnClick} $Group1Radio2
RadioClick

nsDialogs::Show
FunctionEnd

Function
RadioClick
Pop $hwnd
${If} $hwnd
== $Group1Radio1
MessageBox MB_OK "點選:組 1 單選 1"
${ElseIf} $hwnd == $Group1Radio2
MessageBox MB_OK "點選:組 1 單選 2"
${EndIf}
FunctionEnd

Section
""
SectionEnd

然而,你可以透過使用 nsDialogs 的 getUserData 和 setUserData 命令來消除這種情況。使用這些 *UserData 命令,你可以將資料儲存在控制元件中,並在以後輕鬆檢索這些資料。

為了簡化這些命令的使用,我們將使用 NsDialogs UserData 的標頭檔案。

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var hwnd

Function pre
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateRadioButton}
0 0 40% 6% "組 1, 單選 1"
Pop $hwnd
${NSD_AddStyle} $hwnd ${WS_GROUP}
${NSD_SetUserData} $hwnd
"Group1Radio1"
${NSD_OnClick} $hwnd RadioClick
${NSD_CreateRadioButton} 0 12% 40% 6% "組 1, 單選 2"
Pop $hwnd
${NSD_SetUserData} $hwnd
"Group1Radio2"
${NSD_OnClick} $hwnd RadioClick

nsDialogs::Show
FunctionEnd

Function
RadioClick
Pop $hwnd
${NSD_GetUserData} $hwnd $0
${If} $0
== "Group1Radio1"
MessageBox MB_OK "點選:組 1 單選 1"
${ElseIf} $0 == "Group1Radio2"
MessageBox MB_OK "點選:組 1 單選 2"
${EndIf}
FunctionEnd

Section ""
SectionEnd

使用這種方法,你可以輕鬆地將變數設定為儲存在單選按鈕控制元件上的內部字串,而不需要在 OnClick 事件函式中使用任何 If-ElseIf-EndIf 或 Case 選擇。

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre post

var dialog
var hwnd
var minor

Function pre
nsDialogs::Create 1018
Pop $dialog

${NSD_CreateRadioButton}
0 0 40% 6% "我已年滿 14 歲"
Pop $hwnd
${NSD_AddStyle} $hwnd ${WS_GROUP}
${NSD_SetUserData} $hwnd
"false"
${NSD_OnClick} $hwnd RadioClick
${NSD_CreateRadioButton} 0 12% 40% 6% "我未滿 14 歲"
Pop $hwnd
${NSD_SetUserData} $hwnd
"true"
${NSD_OnClick} $hwnd RadioClick

nsDialogs::Show
FunctionEnd

Function
RadioClick
Pop $hwnd
${NSD_GetUserData} $hwnd $minor
FunctionEnd

Function
post
${If} $minor == ""
MessageBox MB_OK "請選擇你的年齡組"
Abort
${ElseIf} $minor == true
MessageBox MB_OK "安裝將繼續進行,內容適合你的年齡"
${Else}
MessageBox MB_OK "安裝將正常進行"
${EndIf}
FunctionEnd

Section
""
SectionEnd

進度條

如何控制進度條控制元件(使用絕對值) 您可以使用 sendMessage 和進度條控制元件的訊息來控制進度條。這些訊息幾乎都在 NSIS 附帶的 WinMessages.nsh 標頭檔案中定義,因此請務必包含此標頭檔案。

至少有一個例外,它非常有用,因為它可以減少程式碼量並使您的原始碼更容易閱讀,那就是 PBM_SETRANGE32。PBM_SETRANGE32 允許您只用兩個數字設定起始和結束範圍,而不必像 PBM_SETRANGE 那樣使用 WinDef.nsh 中的 ${MakeLong}

為了更新進度條的值,您需要使用 nsDialogs 計時器來呼叫處理實際處理的函式。此計時器僅呼叫一次。

下面是一個簡單的示例,該示例建立了一個範圍從 0(零)到 100 的進度條,用於典型的百分比增加,並將進度設定為 25%、50%、75% 和 100%,使用 Sleep 命令來模擬處理發生的情況——通常這可能是其他 NSIS 呼叫或在主安裝之前呼叫外部應用程式/安裝程式等。

!include "WinMessages.nsh"
!include "MUI2.nsh"
!include "nsDialogs.nsh"

OutFile "test.exe"

Section
SectionEnd

Var
dialog
Var hwnd
Var null


Page Custom page.custom
Function page.custom
nsDialogs::Create 1018
Pop $dialog

${NSD_CreateProgressBar}
0 0 100% 10% "Test"
Pop $hwnd

${NSD_CreateTimer}
NSD_Timer.Callback 10

nsDialogs::Show
FunctionEnd

Function
NSD_Timer.Callback
${NSD_KillTimer} NSD_Timer.Callback
SendMessage $hwnd ${PBM_SETRANGE32} 0 100

SendMessage $hwnd ${PBM_SETPOS} 25 0
Sleep 2000
SendMessage $hwnd ${PBM_SETPOS} 50 0
Sleep 2000
SendMessage $hwnd ${PBM_SETPOS} 75 0
Sleep 2000
SendMessage $hwnd ${PBM_SETPOS} 100 0
FunctionEnd

!insertmacro MUI_LANGUAGE "English"

如何控制進度條控制元件(使用步進值)

上一個示例的一個缺點是,您必須始終跟蹤百分比,而這些百分比可能並不重要,只要使用者知道有進度即可。一個例子是,在複製/貼上程式碼塊時,跟蹤百分比可能會變得棘手。您可能會突然發現自己的進度條從 0% 到 50%,然後回到 25%,再上升到 75%。

解決這個問題的一個相當簡單的方法是使用步進進度條。這種方法允許您定義一個步進增量值,並簡單地呼叫步進函式來逐步增加進度條的值。以下是使用這種方法的示例,其功能與前面的示例相同。請注意,我們將範圍設定為函式中預期的步數。

!include "WinMessages.nsh"
!include "MUI2.nsh"
!include "nsDialogs.nsh"

OutFile "test.exe"

Section
SectionEnd

Var
dialog
Var hwnd
Var null

Page Custom page.custom
Function page.custom
nsDialogs::Create 1018
Pop $dialog

${NSD_CreateProgressBar} 0 0 100% 10% "測試"
Pop $hwnd

${NSD_CreateTimer}
NSD_Timer.Callback 10

nsDialogs::Show
FunctionEnd

Function
NSD_Timer.Callback
${NSD_KillTimer} NSD_Timer.Callback
SendMessage $hwnd ${PBM_SETRANGE32} 0 4
SendMessage $hwnd ${PBM_SETSTEP} 1 0

SendMessage $hwnd ${PBM_STEPIT} 0 0
Sleep 2000
SendMessage $hwnd ${PBM_STEPIT} 0 0
Sleep 2000
SendMessage $hwnd ${PBM_STEPIT} 0 0
Sleep 2000
SendMessage $hwnd ${PBM_STEPIT} 0 0

SendMessage $hwnd ${PBM_SETPOS} 4 0
FunctionEnd

!insertmacro MUI_LANGUAGE "English"

請注意,在最後,我們仍然將進度設定為 100%。這是因為您的函式中可能有一些條件步驟。如果您忘記步進進度條,那麼進度值將不會達到 100%。這是一個經常報告的使用者介面問題,使用者抱怨即使過程完成了,進度條仍然停留在少於 100% 的位置。

但是,請注意不要使用比在 PBM_SETRANGE32 呼叫中指定的步數更多的步驟,因為之後的任何步驟都會顯示為 100%,而沒有任何明顯的進展。

如何建立一個跑馬燈(無限迴圈)進度條控制元件

有時您可能不知道進度 - 例如,您正在執行一個可能需要一些時間的任務,但無法確定任務進行到哪一步。在這種情況下,您可能希望使用一個所謂的跑馬燈進度條,它只是從左到右無限迴圈。

有一個需要注意的事項:除非您使用帶有 XP 樣式的介面(另見 XPStyle),否則您不能使用跑馬燈進度條。

除此之外,透過使用 ${NSD_AddStyle} 向進度條新增 PBS_MARQUEE 樣式。

以下是一個這樣的示例:

!include "WinMessages.nsh"
!include "MUI2.nsh"
!include "nsDialogs.nsh"

OutFile "test.exe"

Section
SectionEnd

Var
dialog
Var hwnd
Var null

!define PBS_MARQUEE 0x08

Page Custom page.custom
Function page.custom
nsDialogs::Create 1018
Pop $dialog

${NSD_CreateProgressBar}
0 0 100% 10% "測試"
Pop $hwnd
${NSD_AddStyle} $hwnd ${PBS_MARQUEE}

${NSD_CreateTimer}
NSD_Timer.Callback 10
nsDialogs::Show
FunctionEnd

Function
NSD_Timer.Callback
${NSD_KillTimer} NSD_Timer.Callback ; 關閉定時器
SendMessage $hwnd ${PBM_SETMARQUEE} 1 50 ; start=1|stop=0 間隔(ms)=+N
_again:
MessageBox MB_YESNO "停止跑馬燈?" IDNO _again
SendMessage $hwnd ${PBM_SETMARQUEE} 0 0

FunctionEnd

!insertmacro MUI_LANGUAGE "English"

請注意,跑馬燈進度條總是從左到右執行 - 您不能將其設定為其他任何位置。

如何讓控制元件接收快捷鍵(alt+字母)組合

只有帶標籤的控制元件可以分配快捷鍵,只需在其標題中包含一個 & 符號。例如:

${NSD_CreateCheckbox} 3% 3% 20% 8% "The hot&key here is alt+k"

但是,當在 NSIS 中首次導航到頁面時,NSIS 對話方塊是獲得焦點的,而不是內部的 nsDialogs 對話方塊。因此,在告訴 nsDialogs 顯示之前,請先將焦點設定到 nsDialogs 對話方塊:

nsDialogs::Create 1018
Pop $dialog ; 假設您有一個 'dialog' 變數!
; 後續程式碼在這裡
SendMessage $dialog ${WM_SETFOCUS} $HWNDPARENT 0
nsDialogs::Show

NSIS 對話方塊仍然會處理例如 alt+N 用於下一步按鈕,因為如果當前焦點的視窗沒有對快捷鍵事件作出反應,這些事件會簡單地“冒泡”到父視窗。(提示:這意味著您不應該為 B(ack) 或 N(ext) 字母設定任何快捷鍵!)

使用這些方法,您可以輕鬆建立一個可以完全透過鍵盤操作的安裝程式。

相關文章