nsDialogs :: Show接受ENTER键,即使UI中的所有按钮都被销毁

时间:2015-09-23 14:57:39

标签: nsis nsdialogs

我有一个带有自定义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函数返回,终止安装程序。

我可以阻止它这样做吗?

2 个答案:

答案 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