簡體   English   中英

當我單擊自定義頁面右上角的“完成”按鈕或關閉按鈕時,頁面未使用 NSIS 關閉

[英]When I am clicking on "Finish" button or close button at the top right corner of the custom page, page is not closing using NSIS

我面臨一個奇怪的問題,我添加了一個新的自定義頁面 (MyAbruptPage)。 單擊此自定義頁面右上角的“完成”按鈕或關閉按鈕時,頁面未關閉。

設想:

安裝軟件時,如果出現問題並且安裝沒有正確完成,它會顯示來自 INSTFILES 頁面的 MessageBox。 單擊消息框中的“確定”后,它將導航到“突然”頁面。 在 Abrupt Page 中,它顯示“Finish”按鈕,但是當點擊“Finish”時,頁面沒有關閉,而是顯示一個彈出消息(你確定要關閉嗎?)。 即使我點擊右上角的關閉按鈕,我也會收到相同的彈出消息。 我不想要該消息,單擊“完成”按鈕時應關閉對話框。

觀察:

我認為問題出在頁面的順序上。 因為在這里我使用了兩個自定義頁面(MyInfoPage 和 MyAbruptPage)。

如果我用 MyAbruptPage 替換第一頁 (MyInfoPage)。 然后,當單擊 Abrupt Page 中的“Finish”按鈕時,我沒有看到任何問題。

下面是我的代碼片段,顯示了頁面及其順序:

Page Custom MyInfoPage   ; First Custom page

!define MUI_PAGE_CUSTOMFUNCTION_SHOW WelShow
!insertmacro MUI_PAGE_WELCOME

!define MUI_PAGE_CUSTOMFUNCTION_SHOW MyLicenseShowCallback
!insertmacro MUI_PAGE_LICENSE

!define MUI_PAGE_CUSTOMFUNCTION_SHOW MyDirectoryShowCallback
!insertmacro MUI_PAGE_DIRECTORY

Page Custom MyAbruptPage    ; Second Custom Page

!define MUI_PAGE_CUSTOMFUNCTION_SHOW AbruptShow
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE AbruptLeave
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_PAGE_FINISH

; 下面是我的 Abrupt 頁面代碼

Function AbruptShow
StrCpy $IsOnAbruptPage 1
GetDlgItem $0 $HWNDPARENT 3
ShowWindow $0 0 
FunctionEnd

Function AbruptLeave
StrCpy $IsOnAbruptPage 0
FunctionEnd

Function MyAbruptPage
${IfThen} $IsOnAbruptPage == "" ${|} Abort ${|}
GetDlgItem $0 $HWNDPARENT 1
ShowWindow $0 0 ; Hide Next button

GetDlgItem $0 $HWNDPARENT 3
ShowWindow $0 0 ; Hide Back button

GetDlgItem $0 $HWNDPARENT 2
${NSD_SetText} $0 "Finish"

nsDialogs::Create 1044
Pop $0
${NSD_CreateLabel} 120u 10u 195u ${MUI_WELCOMEPAGE_TITLE_HEIGHT}u "$(AbruptTitle)"
    Pop $AbruptPageTitle
    ;SetCtlColors $InterruptPageTitle "" "${MUI_BGCOLOR}"
    CreateFont $AbruptPageFont "$(^Font)" "12" "700"
    SendMessage $AbruptPageTitle ${WM_SETFONT} $AbruptPageFont 0

 ${NSD_CreateLabel} 120u ${MUI_WELCOMEPAGE_TEXT_TOP}u 195u 130u "$(AbruptText)"
    Pop $AbruptPageText
 Pop $0

nsDialogs::Show
${NSD_FreeImage} $ImageHandle
FunctionEnd

下面是該部分,從這里消息框彈出並導航到 Abrupt 屏幕:

;!insertmacro MUI_LANGUAGE "English" 

Section MySection

SetOutPath $INSTDIR

MessageBox MB_OK|MB_ICONEXCLAMATION "Installation hasn't done properly" IDOK

Call AbruptLeave
        SendMessage $HWNDPARENT 0x408 -1 ""
        Abort 

SectionEnd

;下面是自定義頁面“MyInfoPage”的代碼

Function MyInfoPage

${IfThen} $PageId == "" ${|} Abort ${|}
StrCpy $PageId 0
GetDlgItem $0 $HWNDPARENT 1
ShowWindow $0 0 ; Hide Next button
GetDlgItem $0 $HWNDPARENT 2
${NSD_SetText} $0 "Finish"

nsDialogs::Create 1044
Pop $0

${NSD_CreateLabel} 120u 10u 195u ${MUI_WELCOMEPAGE_TITLE_HEIGHT}u "$(InterruptTitle)"
Pop $InterruptPageTitle   

${NSD_CreateLabel} 120u ${MUI_WELCOMEPAGE_TEXT_TOP}u 195u 130u "$(InterruptText)"
Pop $InterruptPageText

nsDialogs::Show
${NSD_FreeImage} $ImageHandle
FunctionEnd

Function WelShow
StrCpy $PageId 1
GetDlgItem $0 $HWNDPARENT 3
ShowWindow $0 0 ; Hide Back button
FunctionEnd

Function onAbort
${If} $PageId <> 0
    ${If} ${Cmd} ` MessageBox MB_YESNO "Are you sure you want to close?" IDYES `
        SendMessage $HWNDPARENT 0x408 -$PageId ""
    ${EndIf}
    Abort
${EndIf}
FunctionEnd

我曾嘗試更改頁面的順序,並且每次我在兩個自定義頁面中都觀察到不同的行為。 請幫我如何解決這個問題? 以及實現此功能的正確方法。

先感謝您...

下面是完整的代碼,它正在編譯:

Var PageId
Var PrintBtn
Var Image
Var ImageHandle

Var MyInfoPageTitle
Var MyInfoPageFont
var MyInfoPageText
var IsOnAbruptPage
Var AbruptPageTitle
Var AbruptPageFont
var AbruptPageText

!define MUI_CUSTOMFUNCTION_ABORT onAbort

!include "MUI2.nsh"
!include x64.nsh

Name "MyApp"

OutFile "MyApp.exe"

InstallDir "$PROGRAMFILES32\MyApp"

InstallDirRegKey HKLM "Software\MyApp" "Install_Dir"

RequestExecutionLevel admin

!include LogicLib.nsh

;--------------------------------

Page Custom MyInfoPage


  !define MUI_PAGE_CUSTOMFUNCTION_SHOW WelShow

  !define MUI_TEXT_WELCOME_INFO_TITLE $(welcometitle)
  !define MUI_TEXT_WELCOME_INFO_TEXT $(welcometext)

  !insertmacro MUI_PAGE_WELCOME
  
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW MyLicenseShowCallback

  !define MUI_LICENSEPAGE_CHECKBOX ""
  !define MUI_INNERTEXT_LICENSE_BOTTOM ""
  !define MUI_INNERTEXT_LICENSE_TOP ""
  !define MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX ""
  
  !define MUI_TEXT_LICENSE_TITLE $(licensetitle)
  !define MUI_TEXT_LICENSE_SUBTITLE $(licensesubtitle)
  !define MUI_LICENSEPAGE_CHECKBOX_TEXT $(licensecheckboxtext)
  
  !insertmacro MUI_PAGE_LICENSE "C:\Program Files (x86)\NSIS\Docs\Modern UI 2\license.txt"

 !define MUI_PAGE_CUSTOMFUNCTION_SHOW MyDirectoryShowCallback
 
!define MUI_DIRECTORYPAGE_TEXT_TOP $(mydirtoptext)
!define MUI_TEXT_DIRECTORY_TITLE $(mydirtitle)
!define MUI_TEXT_DIRECTORY_SUBTITLE $(mydirsubtitle)

  !insertmacro MUI_PAGE_DIRECTORY
  
  Page Custom MyAbruptPage   

!define MUI_PAGE_CUSTOMFUNCTION_SHOW AbruptShow
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE AbruptLeave


  !insertmacro MUI_PAGE_INSTFILES
   
  !define MUI_TEXT_FINISH_INFO_TITLE $(Finishpagetitle)
  !define MUI_TEXT_FINISH_INFO_TEXT $(Finishpagesubtitle)

  !define MUI_FINISHPAGE_RUN ""
  !define MUI_FINISHPAGE_RUN_TEXT $(FinishonlineReg)

  !insertmacro MUI_PAGE_FINISH

  !insertmacro MUI_UNPAGE_INSTFILES
  
 ;--------------------------------
  !insertmacro MUI_LANGUAGE "English" 

Function .onInit
InitPluginsDir

FunctionEnd
Function MyDirectoryShowCallback
StrCpy $PageId 3

GetDlgItem $0 $hwndparent 1 ; 
SendMessage $0 ${WM_SETTEXT} 0 `STR:$(^NextBtn)`
FunctionEnd

Function MyLicenseShowCallback

StrCpy $PageId 2

GetDlgItem $0 $hwndparent 2 
System::Call *(i,i,i,i)p.r1
System::Call 'USER32::GetWindowRect(pr0,pr1)'
System::Call *$1(i.r2,i.r3,i.r4,i.r5)
IntOp $5 $5 - $3 ;height
IntOp $4 $4 - $2 ;width
System::Call 'USER32::ScreenToClient(p$hwndparent,pr1)'
System::Call *$1(i.r2,i.r3)
System::Free $1
IntOp $2 $4 / 5
System::Call 'USER32::CreateWindowEx(i 0,t "Button",t "Print",i ${WS_CHILD}|${WS_VISIBLE}|${WS_TABSTOP},i r2,i r3,i r4,i r5,p $hwndparent,p 0x666,p 0,p 0)p.r0'
StrCpy $PrintBtn $0
SendMessage $hwndparent ${WM_GETFONT} 0 0 $1
SendMessage $0 ${WM_SETFONT} $1 1
ButtonEvent::AddEventHandler 0x666 $0
FunctionEnd

Function WelShow
StrCpy $PageId 1
GetDlgItem $0 $HWNDPARENT 3
ShowWindow $0 0 
FunctionEnd

Function MyInfoPage
${IfThen} $PageId == "" ${|} Abort ${|}
StrCpy $PageId 0
GetDlgItem $0 $HWNDPARENT 1
ShowWindow $0 0 
GetDlgItem $0 $HWNDPARENT 2
${NSD_SetText} $0 "Finish"

nsDialogs::Create 1044
Pop $0

!define MUI_WELCOMEPAGE_TITLE_HEIGHT 38
!define /math MUI_WELCOMEPAGE_TEXT_TOP 17 + ${MUI_WELCOMEPAGE_TITLE_HEIGHT}

${NSD_CreateLabel} 120u 10u 195u 28u "Setup Wizard was interrupted"

    Pop $MyInfoPageTitle
    CreateFont $MyInfoPageFont "$(^Font)" "12" "700"
    SendMessage $MyInfoPageTitle ${WM_SETFONT} $MyInfoPageFont 0
     ${NSD_CreateLabel} 120u ${MUI_WELCOMEPAGE_TEXT_TOP}u 195u 130u "Setup Wizard was interrupted"
    Pop $MyInfoPageText

Pop $0

nsDialogs::Show
${NSD_FreeImage} $ImageHandle
FunctionEnd

Function onAbort
${If} $PageId <> 0
    ${If} ${Cmd} ` MessageBox MB_YESNO "Are you sure you want to CANCEL" IDYES `
        SendMessage $HWNDPARENT 0x408 -$PageId ""
    ${EndIf}
    Abort
${EndIf}
FunctionEnd


Function AbruptShow
StrCpy $IsOnAbruptPage 1
GetDlgItem $0 $HWNDPARENT 3
ShowWindow $0 0 
FunctionEnd

Function AbruptLeave
StrCpy $IsOnAbruptPage 0
FunctionEnd

Function MyAbruptPage
${IfThen} $IsOnAbruptPage == "" ${|} Abort ${|}
GetDlgItem $0 $HWNDPARENT 1
ShowWindow $0 0 

GetDlgItem $0 $HWNDPARENT 3
ShowWindow $0 0 

GetDlgItem $0 $HWNDPARENT 2

${NSD_SetText} $0 "Finish"

nsDialogs::Create 1044
Pop $0

${NSD_CreateLabel} 120u 10u 195u ${MUI_WELCOMEPAGE_TITLE_HEIGHT}u "Setup Wizard ended prematurely"
    Pop $AbruptPageTitle

    CreateFont $AbruptPageFont "$(^Font)" "12" "700"
    SendMessage $AbruptPageTitle ${WM_SETFONT} $AbruptPageFont 0

 ${NSD_CreateLabel} 120u ${MUI_WELCOMEPAGE_TEXT_TOP}u 195u 130u "Setup Wizard ended prematurely"
    Pop $AbruptPageText
 Pop $0

nsDialogs::Show
${NSD_FreeImage} $ImageHandle
FunctionEnd


  SectionIn RO

SetOutPath $INSTDIR

MessageBox MB_OK|MB_ICONEXCLAMATION "There is an installation failure. Aborting the installation process" IDOK

Call AbruptLeave
        SendMessage $HWNDPARENT 0x408 -1 ""
        Abort

SectionEnd
  
Section "Uninstall"

SectionEnd

您看到的MessageBox來自您在onAbort函數中自己的代碼!

你正在做的事實

!define MUI_PAGE_CUSTOMFUNCTION_SHOW AbruptShow
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE AbruptLeave

表明您不了解自定義頁面的工作原理。

要使您的特殊中止頁面無需進一步操作即可退出,當您在該頁onAbort時,您onAbortonAbort函數中執行任何操作:

Var PageId
var IsOnAbruptPage
!define MUI_CUSTOMFUNCTION_ABORT onAbort
!include "MUI2.nsh"
!include LogicLib.nsh
Name "MyApp"

#OutFile "MyApp.exe"
InstallDir "$temp\MyApp"
#RequestExecutionLevel admin
OutFile Test.exe
RequestExecutionLevel user


;--------------------------------
Page Custom MyInfoPage
!define MUI_PAGE_CUSTOMFUNCTION_SHOW WelShow
!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_SHOW MyLicenseShowCallback
!insertmacro MUI_PAGE_LICENSE "${__FILE__}"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW MyDirectoryShowCallback
!insertmacro MUI_PAGE_DIRECTORY
Page Custom MyAbruptPage 
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
;--------------------------------
!insertmacro MUI_LANGUAGE "English" 

Function MyDirectoryShowCallback
StrCpy $PageId 3
GetDlgItem $0 $hwndparent 1 ; 
SendMessage $0 ${WM_SETTEXT} 0 `STR:$(^NextBtn)`
FunctionEnd

Function MyLicenseShowCallback
StrCpy $PageId 2
FunctionEnd

Function WelShow
StrCpy $PageId 1
GetDlgItem $0 $HWNDPARENT 3
ShowWindow $0 0 
FunctionEnd


Function MyInfoPage
${IfThen} $PageId == "" ${|} Abort ${|}
StrCpy $PageId 0
GetDlgItem $0 $HWNDPARENT 1
ShowWindow $0 0 
GetDlgItem $0 $HWNDPARENT 2
${NSD_SetText} $0 "Finish"
nsDialogs::Create 1044
Pop $0
${NSD_CreateLabel} 120u 10u 195u 28u "Setup Wizard was interrupted"
Pop $0
nsDialogs::Show
FunctionEnd

Function onAbort
${If} $IsOnAbruptPage <> 0 ; If on aborted page
    Return                 ; allow simple exit
${EndIf}
${If} $PageId <> 0
    ${If} ${Cmd} ` MessageBox MB_YESNO "Are you sure you want to CANCEL" IDYES `
        SendMessage $HWNDPARENT 0x408 -$PageId ""
    ${EndIf}
    Abort
${EndIf}
FunctionEnd

Function GoToAbruptPage
StrCpy $IsOnAbruptPage 1
SendMessage $HWNDPARENT 0x408 -1 ""
Abort
FunctionEnd

Function MyAbruptPage
${IfThen} $IsOnAbruptPage == "" ${|} Abort ${|}
GetDlgItem $0 $HWNDPARENT 1
ShowWindow $0 0 
GetDlgItem $0 $HWNDPARENT 3
ShowWindow $0 0 
GetDlgItem $0 $HWNDPARENT 2
${NSD_SetText} $0 "Finish"
nsDialogs::Create 1044
Pop $0
${NSD_CreateLabel} 120u 10u 195u 20u "Setup Wizard ended prematurely"
Pop $0
${NSD_CreateLabel} 120u 120u 195u 20u "Setup Wizard ended prematurely"
Pop $0
nsDialogs::Show
FunctionEnd

;--------------------------------
Section "$(^Name) (required)"
SectionIn RO
SetOutPath $INSTDIR

MessageBox MB_OK|MB_ICONEXCLAMATION "There is an installation failure. Aborting the installation process" IDOK
Call GoToAbruptPage
SectionEnd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM