2015-09-23 2 views
0

J'ai un petit bootstrapper avec une interface utilisateur personnalisée, qui contient deux pages, une pour configurer l'installation, et l'autre montrant une barre de progression pour le téléchargement et l'installation de la charge utile. Mon problème: Si l'utilisateur appuie sur la touche Entrée dans la deuxième page, l'installateur quitte, même s'il n'a pas terminé l'installation.nsDialogs :: Show accepte la touche ENTRÉE même si tous les boutons de l'interface utilisateur sont détruits

J'ai enlevé tous les contrôles que je pouvais de l'interface utilisateur avec:

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

dans la fonction onGuiInit, et la première page ne tient pas entrer et les clés de l'espace maintenant, mais la deuxième page existe toujours sur la touche Entrée. Je n'ai aucun autre composant sur cette page à part quelques étiquettes, une barre de progression et un diaporama (plugin nsisSlideshow). En arrière-plan, j'ai un fil qui télécharge et installe la charge utile.

Les pages sont déclarées comme ceci:

Page Custom Options_Show Options_Leave 
Page Custom Progress_Show Progress_Leave 

Alors, longue histoire courte, quand je presse entrer, les nsDialogs :: PRÉSENTÉ fonction, tuant l'installateur.

De toute façon je peux l'empêcher de faire cela?

Répondre

0

Vous devriez vraiment essayer d'arrêter les changements de page en appelant Abort dans la fonction de rappel de page. NSIS bloque uniquement les clics provenant des boutons et désactivés.

!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 
+0

Merci @Anders. En suivant votre conseil pour ne pas détruire les boutons, et les désactiver à la place, maintenant ça marche! Donc, j'ai supprimé le code qui a détruit les boutons, puis dans Options_Show et Progress_Show, la première chose à faire est de désactiver les boutons. –

0

Tout d'abord, un petit extrait de code:

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

Ensuite, en fonction Progress_Show vous devez appeler

$ {EnableNextButton} 0

avant

nsDialogs :: Afficher

pour désactiver Suivant le bouton avant qu'il ne s'affiche. Après la fin de téléchargement (au rappel de téléchargement) appellent

$ {} EnableNextButton 1

pour lui permettre à nouveau.

Votre variante avec .onGuiInit ne fonctionne pas car elle appelle une seule fois - avant que la première page ne s'affiche. Mais chaque page suivante sera créée dynamiquement à nouveau, ainsi, toute la page d'interface utilisateur doit être implémentée dans la page personnalisée -Pre fonction.

+0

Merci @Serge, essayé, mais il se ferme encore sur entrer. –

+0

Et, il semble que le bouton Suivant n'existe pas. Depuis que je l'ai détruit dans la méthode onGuiInit. GetDlgItem renvoie 0. –

+0

J'ai essayé d'ajouter un autre bouton et de le définir par défaut. Toujours rien. –