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

nsDialogs::Show accepts ENTER key even if all buttons from UI are destroyed

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

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

GetDlgItem  $HWNDPARENT 1 //(2, and 3)
System::Call `User32::DestroyWindow(i )`

在onGuiInit函数中,第一页现在忽略回车和space键,但第二页仍然按回车键退出。 除了一些标签、进度条和幻灯片(nsisSlideshow 插件)外,我在该页面上没有其他组件。 在后台我有一个线程下载并安装有效载荷。

页面声明如下:

Page Custom Options_Show Options_Leave
Page Custom Progress_Show Progress_Leave

所以,长话短说,当我按下回车键时,nsDialogs::Show 函数 returns 终止了安装程序。

有什么方法可以阻止它这样做吗?

一、小代码片段:

!macro EnableNextButtonM IsEnable
    Push 
    GetDlgItem  $HWNDPARENT 1 ;next button
    EnableWindow  ${IsEnable}
    Pop 
!macroend
!define EnableNextButton "!insertmacro EnableNextButtonM"

然后,在函数 Progress_Show 中你应该调用

${EnableNextButton} 0

之前

nsDialogs::显示

下一步 按钮显示之前禁用它。 下载完成后(在下载回调中)调用

${EnableNextButton} 1

再次启用它。

您使用 .onGuiInit 的变体不起作用,因为它调用一次 - 在第一页显示之前。但是每一个下一页都将再次动态创建,因此,所有 UI 页面必须实现到页面自定义 -Pre 函数中。

您真的应该尝试通过在页面离开回调函数中调用 Abort 来停止转发页面更改。

NSIS 仅阻止来自存在的按钮的点击 被禁用。

!include nsDialogs.nsh
Page Custom Options_Show #Options_Leave
Page Custom Progress_Show #Progress_Leave

Function DisableBottomButtons
GetDlgItem [=10=] $hwndparent 1
ShowWindow [=10=] 0
EnableWindow [=10=] 0
GetDlgItem [=10=] $hwndparent 2
ShowWindow [=10=] 0
EnableWindow [=10=] 0
GetDlgItem [=10=] $hwndparent 3 
ShowWindow [=10=] 0
EnableWindow [=10=] 0
FunctionEnd


Function Options_Show
nsDialogs::Create 1018
Pop [=10=]
${NSD_CreateButton} 0 20 100% 12u "Go to next page"
Pop [=10=]
${NSD_OnClick} [=10=] GoToNextPage
Call DisableBottomButtons
nsDialogs::Show
FunctionEnd

Function GoToNextPage
GetDlgItem [=10=] $hwndparent 1
EnableWindow [=10=] 1
SendMessage $hwndparent ${WM_COMMAND} 1 0
FunctionEnd


Function Progress_Show
nsDialogs::Create 1018
Pop [=10=]
${NSD_CreateButton} 0 20 100% 12u "Exit"
Pop [=10=]
${NSD_OnClick} [=10=] 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