Fermeture d'une application lors d'une installation ou d'une désinstallation
Tutorial pour novices
Introduction
Vous connaisez tous le pack fr pour Winamp qui s'installe même si WinAmp est ouvert. Mais comment font-ils? me diriez-vous, bah ... tout simplement en utilisant la fonction 'CloseWinamp' disponible par défaut dans 'C:\Program Files\NSIS\Exemples\Function.htm'. Seulement voila, pour utiliser cette fonction, il faut savoir quels paramètres attribuer a la fonction FindWindow et c'est la que ca se complique.
Préparatifs
Il vous faut tout d'abord récupérer le logiciel 'GetClass'.
Installez et lancez 'GetClass' (qui reste toujours au premier plan) et sélectionez la fenêtre principale du logicel que vous désirez fermer lors d'une installation ou d'une désinstallation. Par exemple:
En sélectionnant la fenêtre principale du logiciel cible, vous obtenez :
Mozilla (Navigateur Internet)
Photoshop (Logiciel de retouche d'images)
Comme vous pouvez le constater, il y a trois champs, cependant l'attribut ne nous servira pas. Nous nous retrouvons alors avec le titre de la fenêtre, ainsi que ca classe. Si, comme c'est le cas de Mozilla, le titre de la fenêtre varie en fonction de son contenu, il ne sera donc pas possible de l'utiliser. Par contre Photoshop nous permet de l'utiliser. La classe de l'application est quand à elle nécessaire dans tous les cas.
Fonctions de fermeture
- Pour Mozilla (Fenêtres à titre variable)
; CloseMozilla ; Ferme toutes les instances de Mozilla, ne modifit aucune autre variable. Function CloseMozilla ; Début de la fonction. Push$0 ; Met la varible $0 dans la pile (elle contient 0). loop: ; Label du nom de 'loop'. FindWindow $0 "Mozilla" ; Recherche la fenêtre 'Mozilla' et la place dans la pile. IntCmp$0 0 done ; Si les entiers $0 et 0 sont égaux, la fenêtre n'a pas été trouvée, on saute jusqu'à 'done'; sinon on continue. SendMessage $0 16 0 0 ; Envoie de la commande de fermeture (16) de la fenêtre ($0) Sleep 100 ; Pause d'une seconde Goto loop ; Retour au label 'loop' pour fermer d'autres instances de 'Mozilla' done: ; Label du nom de 'don' Pop$0 ; Retire la variable $0 de la pile FunctionEnd ; Fin de la fonction
- Pour Photoshop (Fenêtres à titre fixe)
Pour plus de sureté dans la fermeture de l'application, il est préférable d'introduire le titre de la fenêtre (lorsqu'il est fixe) afin d'être sûr de ne pas fermer une application ayant la même classe qu'une autre.
; ClosePhotoshop ; Ferme toutes les instances de Photoshop, ne modifit aucune autre variable. Function ClosePhotoshop ; Début de la fonction. Push$0 ; Met la varible $0 dans la pile (elle contient 0). loop: ; Label du nom de 'loop'. FindWindow $0 "Photoshop" "Adobe Photoshop" ; Recherche la fenêtre 'Photoshop' ayant le titre 'Adobe Photoshop' et la place dans la pile. IntCmp$0 0 done ; Si les entiers $0 et 0 sont égaux, la fenêtre n'a pas été trouvée, on saute jusqu'à 'done'; sinon on continue. SendMessage $0 16 0 0 ; Envoie de la commande de fermeture (16) de la fenêtre ($0) Sleep 100 ; Pause d'une seconde Goto loop ; Retour au label 'loop' pour fermer d'autres instances de 'Photoshop' done: ; Label du nom de 'don' Pop$0 ; Retire la variable $0 de la pile FunctionEnd ; Fin de la fonction
Comment, ou et quand appeler ces fonctions ?
Vous devez appelez cette fonction par 'Call CloseMozilla' dans une section d'installation et par 'Call un.CloseMozilla' dans une section de désinstallation.
(CloseMozilla et un.CloseMozilla étant les noms de mes deux fonctions) et mettre la fonction à la fin de votre script.
Section "" ; Section d'installation Call CloseMozilla ; Appel de la fonction de fermeture de Mozilla SetOutPath"$INSTDIR\Plugins" File /r *.* CreateDirectory"$SMPROGRAMS\Mozilla_Plugin" CreateShortcut"$SMPROGRAMS\Mozilla_Plugin\Désinstaller.lnk" "$INSTDIR\Désinstaller.exe" SectionEnd Section"Uninstall" ; Section d'installation Call un.CloseMozilla ; Appel de la fonction de fermeture de Mozilla Delete"$SMPROGRAMS\Mozilla_Plugin\Désinstaller.lnk" RMDir"$SMPROGRAMS\Mozilla_Plugin" Delete"$INSTDIR\Désinstaller.exe" RMDir /r "$INSTDIR\Plugins" SectionEnd
Version avancée de la fermeture d'applications
Pour les utilisateurs qui en ont le courage, le script suivant permet aussi la fermeture des applications, mais utilise des fonctionnalités avancées de NSIS.
loop: FindWindow $0 "Mozilla" IntCmp $0 0 done IsWindow $0 0 done System::Call 'user32::PostMessageA(i,i,i,i) i($0,${WM_CLOSE},0,0)' Sleep 100 Goto loop done:
Et si vous voulez pas vous embeter a faire tout ça, telechargez KillProcDll (extrayez juste KillProcDLL.dll dans C:\Program Files\NSIS\Plugins\) et ajoutez juste (pour éteindre MSN Messenger par exemple) :
KillProcDLL:KillProc "msnmsgr.exe"
Une idée de pas à pas ?
Contactez Julien.
