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

Nsis nsDialogs::Show接受ENTER键,即使UI中的所有按钮都已销毁,nsis,nsdialogs,Nsis,Nsdialogs,我有一个带有自定义UI的小型引导程序,它包含两个页面,一个用于配置安装,另一个显示用于下载和安装负载的progressbar。 我的问题是: 如果用户在第二个页面中按Enter键,安装程序将退出,即使它没有完成安装 我从UI中删除了所有可以使用的控件: GetDlgItem $1 $HWNDPARENT 1 //(2, and 3) System::Call `User32::DestroyWindow(i $1)` 在onGuiInit函数中,第一个页面现在忽略enter键和空格键,但第二个

我有一个带有自定义UI的小型引导程序,它包含两个页面,一个用于配置安装,另一个显示用于下载和安装负载的progressbar。 我的问题是: 如果用户在第二个页面中按Enter键,安装程序将退出,即使它没有完成安装

我从UI中删除了所有可以使用的控件:

GetDlgItem $1 $HWNDPARENT 1 //(2, and 3)
System::Call `User32::DestroyWindow(i $1)`
在onGuiInit函数中,第一个页面现在忽略enter键和空格键,但第二个页面仍然在enter键上退出。 除了一些标签、一个进度条和一个幻灯片(nsisSlideshow插件),我在那个页面上没有其他组件。 在后台,我有一个线程来下载和安装负载

页面声明如下:

Page Custom Options_Show Options_Leave
Page Custom Progress_Show Progress_Leave
长话短说,当我按enter键时,nsDialogs::Show函数返回,终止安装程序


我能阻止它这样做吗?

首先,小代码段:

!macro EnableNextButtonM IsEnable
    Push $1
    GetDlgItem $1 $HWNDPARENT 1 ;next button
    EnableWindow $1 ${IsEnable}
    Pop $1
!macroend
!define EnableNextButton "!insertmacro EnableNextButtonM"
然后,在函数过程中显示您应该调用

${EnableNextButton}0

之前

nsDialogs::Show

在显示“下一步”按钮之前禁用该按钮。 下载完成后(在下载回调时)调用

${EnableNextButton}1

再次启用它


您使用的.onGuiInit变量不起作用,因为它在显示第一页之前只调用一次。但是,下一个页面将再次动态创建,因此,所有UI页面都必须实现为页面自定义预处理功能。

您确实应该尝试通过调用页面离开回调函数中的
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

谢谢@Serge,试过了,但回车时还是退出了。而且,似乎下一步按钮不存在。因为我在onGuiInit方法中破坏了它。GetDlgItem返回0。我尝试添加另一个按钮,并将其设置为默认值。仍然没有。不要删除控件,只需禁用它。您可以停止调用Abort in Progress_leaveThank@Anders的转换。按照您的建议不要破坏按钮,而是禁用它们,现在它可以工作了!因此,我删除了破坏按钮的代码,然后在选项显示和进度显示中,首先要禁用按钮。