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
我有一个带有自定义 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