我有一个带有自定义UI的小型引导程序,它包含两个页面,一个用于配置安装,另一个用于显示下载和安装有效内容的进度条。 我的问题: 如果用户在第二页中按下Enter键,则安装程序退出,即使它没有完成安装。
我通过以下方式删除了我可以使用的所有控件:
GetDlgItem $1 $HWNDPARENT 1 //(2, and 3)
System::Call `User32::DestroyWindow(i $1)`
在onGuiInit函数中,第一页现在忽略了输入和空格键,但第二页仍然在Enter键上退出。 除了一些标签,进度条和幻灯片(nsisSlideshow插件)之外,我在该页面上没有其他组件。 在后台我有一个下载并安装有效负载的线程。
页面声明如下:
Page Custom Options_Show Options_Leave
Page Custom Progress_Show Progress_Leave
所以,长话短说,当我按回车键时,nsDialogs :: Show函数返回,终止安装程序。
我可以阻止它这样做吗?
答案 0 :(得分:0)
首先,小代码片段:
!macro EnableNextButtonM IsEnable
Push $1
GetDlgItem $1 $HWNDPARENT 1 ;next button
EnableWindow $1 ${IsEnable}
Pop $1
!macroend
!define EnableNextButton "!insertmacro EnableNextButtonM"
然后,在函数Progress_Show中,你应该调用
$ {EnableNextButton} 0
之前
nsDialogs ::显示
在显示之前禁用下一步按钮。 下载完成后(在下载回调中)调用
$ {EnableNextButton} 1
再次启用它。
使用.onGuiInit的变体不起作用,因为它会调用一次 - 在显示第一页之前。但是每个下一页都会再次动态创建,因此,所有UI页面都必须实现为页面自定义-Pre函数。
答案 1 :(得分:0)
您真的应该尝试通过在页面离开回调函数中调用Abort
来停止向前翻页。
NSIS仅阻止存在和的按钮的点击次数。
!include nsDialogs.nsh
Page Custom Options_Show #Options_Leave
Page Custom Progress_Show #Progress_Leave
Function DisableBottomButtons
GetDlgItem $0 $hwndparent 1
ShowWindow $0 0
EnableWindow $0 0
GetDlgItem $0 $hwndparent 2
ShowWindow $0 0
EnableWindow $0 0
GetDlgItem $0 $hwndparent 3
ShowWindow $0 0
EnableWindow $0 0
FunctionEnd
Function Options_Show
nsDialogs::Create 1018
Pop $0
${NSD_CreateButton} 0 20 100% 12u "Go to next page"
Pop $0
${NSD_OnClick} $0 GoToNextPage
Call DisableBottomButtons
nsDialogs::Show
FunctionEnd
Function GoToNextPage
GetDlgItem $0 $hwndparent 1
EnableWindow $0 1
SendMessage $hwndparent ${WM_COMMAND} 1 0
FunctionEnd
Function Progress_Show
nsDialogs::Create 1018
Pop $0
${NSD_CreateButton} 0 20 100% 12u "Exit"
Pop $0
${NSD_OnClick} $0 ExitApp
Call DisableBottomButtons
nsDialogs::Show
FunctionEnd
Function ExitApp
MessageBox mb_ok "Bye"
; Faking a click on Next/Close will not work when the button is disabled,
; this uses a slightly ugly trick to bypass that. GoToNextPage does it properly.
!define /math WM_NOTIFY_OUTER_NEXT ${WM_USER} + 0x8
SendMessage $hwndparent ${WM_NOTIFY_OUTER_NEXT} 1 0
FunctionEnd