0

我有一个带有自定义 UI 的小型引导程序,其中包含两个页面,一个用于配置安装,另一个显示用于下载和安装有效负载的进度条。我的问题:如果用户在第二页按 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

所以,长话短说,当我按下回车键时,nsDialogs::Show 函数返回,杀死安装程序。

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

4

2 回答 2

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函数中。

于 2015-09-24T07:49:00.697 回答
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
于 2015-09-24T11:22:00.073 回答