如何使用NSIS设置windows installer完成页面中默认选中的复选框

如何使用NSIS设置windows installer完成页面中默认选中的复选框,nsis,Nsis,我想在使用NSIS的windows installer完成页面中将复选框设置为默认选中。为此,我使用了下面截取的代码。但它甚至没有在“完成”页面中显示复选框。请帮我做这个 Var Checkbox Var CheckState ; Stored globally so we remember the choice if the user presses the back button and goes back to our page !define CheckHeight 28 !macro

我想在使用NSIS的windows installer完成页面中将复选框设置为默认选中。为此,我使用了下面截取的代码。但它甚至没有在“完成”页面中显示复选框。请帮我做这个

Var Checkbox
Var CheckState ; Stored globally so we remember the choice if the user presses the back button and goes back to our page
!define CheckHeight 28
!macro CreateNativeControl hParent cls style exstyle x y w h text ; Note: Only supports pixel coordinates
System::Call 'USER32::CreateWindowEx(i ${exstyle}, t "${cls}", ts, i ${style}, i ${x}, i ${y}, i ${w}, i ${h}, p ${hParent}, i0, i0, i0)p.s' "${text}"
!macroend

 !define MUI_PAGE_CUSTOMFUNCTION_SHOW FinishShow
 !insertmacro MUI_PAGE_FINISH

Function FinishShow

  System::Call *(i,i,i,i)p.r0 ; NSIS 2.51+
  System::Call 'USER32::GetWindowRect(p$mui.FinishPage.Text, pr0)'
  System::Call 'USER32::MapWindowPoints(i0,p$mui.FinishPage,p$0,i2)'
  System::Call '*$0(i.r2,i.r3,i.r4,i.r5)'
  System::Free $0
  IntOp $5 $5 - ${CheckHeight}
  System::Call 'USER32::SetWindowPos(i$mui.FinishPage.Text,i,i,i,i$4,i$5,i0x6)'
  
  ; Create and initialize the checkbox
  IntOp $5 $3 + $5 ; y = TextTop + TextHeight
  !insertmacro CreateNativeControl $mui.FinishPage ${__NSD_CheckBox_CLASS} "${__NSD_CheckBox_STYLE}" "${__NSD_CheckBox_EXSTYLE}" 0 $5 300 ${CheckHeight} "CheckboxTest"
  Pop $Checkbox
  SendMessage $mui.FinishPage ${WM_GETFONT} 0 0 $0 
  SendMessage $Checkbox ${WM_SETFONT} $0 1 
  System::Call 'USER32::SetWindowPos(i$Checkbox,i0,i,i,i,i,i0x33)' 
  ${IfThen} $CheckState == "" ${|} StrCpy $CheckState 1 ${|} 
  ${NSD_SetState} $Checkbox $CheckState
FunctionEnd

“完成”页面内置了对两个可选复选框的支持:

!include MUI2.nsh
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN ""
!define MUI_FINISHPAGE_RUN_TEXT "Run Foo"
!define MUI_FINISHPAGE_RUN_FUNCTION MyRunFoo
;define MUI_FINISHPAGE_RUN_NOTCHECKED
!define MUI_FINISHPAGE_SHOWREADME "$InstDir\Bar.exe"
!define MUI_FINISHPAGE_SHOWREADME_TEXT "Run Bar"
;define MUI_FINISHPAGE_SHOWREADME_FUNCTION
!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE English

Function MyRunFoo
; Exec '"$InstDir\Foo.exe"'
FunctionEnd

Section
SectionEnd
您的示例代码还缺少对
的重要调用!插入宏MUI_语言

只有选中复选框时,才会执行MUI_FINISHPAGE_RUN_函数指定的函数。这是正常的预期行为

如果要执行自定义处理,可以在“离开”页面中执行:

!include nsDialogs.nsh
!include LogicLib.nsh
!include MUI2.nsh
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN "" 
!define MUI_FINISHPAGE_RUN_TEXT "Blah blah" 
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE FinishLeave 
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE English

Function FinishLeave 
${NSD_GetState} $mui.FinishPage.Run $0 ; or $mui.FinishPage.ShowReadme
${If} $0 <> 0 
MessageBox mb_ok "Checkbox checked"
${Else} 
MessageBox mb_ok "Checkbox not checked" 
${EndIf}
FunctionEnd
!包括nsDialogs.nsh
!包括LogicLib.nsh
!包括MUI2.nsh
!插入宏MUI\u页面\u欢迎
!插入宏MUI_页面文件
!定义MUI_FINISHPAGE_RUN“”
!定义MUI_FINISHPAGE_RUN_文本“废话”
!定义MUI\u页面\u自定义功能\u离开完成离开
!插入宏MUI\u页面\u完成
!插入宏梅语言英语
函数结束休假
${NSD_GetState}$mui.FinishPage.Run$0;或$mui.FinishPage.ShowReadme
${If}$0
MessageBox mb_ok“复选框已选中”
${Else}
MessageBox mb_ok“未选中复选框”
${EndIf}
功能端

当您从Stackoverflow答案中获取代码时,请链接到自定义代码,此处不适用CreateNativeControl。通常,只有选中复选框时,您才会执行某些操作。MUI_FINISHPAGE_RUN_函数仅在选中时执行。你从哪里得到$Checkbox的?