Icône rémanente

Le
olegna
Bonjour (bonsoir) à tous.
J'ai fait un petit script pour enchaîner l'action de mon antispam Outclock
et de mon courrieleur OE6 lancé par OE-Quotefix.
Voilà le Script :
Début :
_______________________________________________________________
dim oShell,oProg
set oShell=WScript.createobject("WScript.Shell")
set oProg=oShell.Exec ("C:ProgrammesOutClockStunnelstunnel-4.08.exe")
oShell.Run "C:ProgrammesOutClockOutClock.exe",,1
oProg.Terminate
oShell.Run "C:Progra~1OE-QuoteFixOELaunch.exe",,0
set oProg=nothing
set oShell=nothing
__________________________________________________________________
Fin :
L'icône du programme que je ferme par la méthode Terminate reste dans la
zone de notification et ne disparaît que si je passe la souris par dessus.
Est-ce normal ? A part cela, le script marche très bien. Seulement, je suis
frustré de ne pas savoir le pourquoi de ce comportement.
Merci, par avance de vos réponses éventuelles.

--
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
MCI \(ex do ré Mi chel la si do\) [MVP]
Le #17285821
Bonsoir !

L'icône ... reste dans la zone de notification et ne disparaît que si
je passe la souris par dessus. Est-ce normal ?



Oui, c'est normal. Tant qu'il n'y a pas rafraîchissement du bureau (de
l'écran).
Ça m'arrive très souvent, et je n'y fait même plus attention.

@-salutations
--
Michel Claveau
Gilles LAURENT [MVP]
Le #17286061
"olegna" a écrit dans le message de
news:%
| Bonjour (bonsoir) à tous.

Bonsoir,

| L'icône du programme que je ferme par la méthode Terminate reste dans
| la zone de notification et ne disparaît que si je passe la souris par
| dessus. Est-ce normal ?

Le fait de terminer une application via la méthode Terminate ne permet
pas à l'application de libérer correctement ses ressources. Dans votre
exemple, l'application n'est pas en mesure d'appeler l'API Win32
Shell_NotifyIcon avec le message NIM_DELETE permettant de supprimer son
icône de la zone de notification avant sa fermeture. Le fait de survoler
l'icône avec la souris permet au gestionnaire de la zone de notification
de supprimer l'icône orphelin car celui-ci se rend automatiquement
compte qu'aucun processus ne gère les messages associés à cet icône. Si
l'application fonctionne en mode fenêtré, une technique pour terminer
l'application proprement consiste à mettre la fenêtre en premier plan
(oShell.AppActivate oProg.ProcessID) puis à injecter la séquence clavier
"Alt+F4" via SendKeys. Une autre technique consiste à envoyer le message
Windows WM_CLOSE à l'application via une API Win32 du genre SendMessage,
PostMessage, ... Toutefois, cette dernière solution nécessite d'utiliser
un Wrapper du type DynaWrap. En espérant avoir été suffisamment clair
;-)

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
olegna
Le #17287761
Dans le message : ,
Gilles LAURENT [MVP] a écrit :
"olegna" a écrit dans le message de
news:%
Bonjour (bonsoir) à tous.



Bonsoir,

L'icône du programme que je ferme par la méthode Terminate reste dans
la zone de notification et ne disparaît que si je passe la souris par
dessus. Est-ce normal ?



Le fait de terminer une application via la méthode Terminate ne permet
pas à l'application de libérer correctement ses ressources. Dans votre
exemple, l'application n'est pas en mesure d'appeler l'API Win32
Shell_NotifyIcon avec le message NIM_DELETE permettant de supprimer
son icône de la zone de notification avant sa fermeture. Le fait de
survoler l'icône avec la souris permet au gestionnaire de la zone de
notification de supprimer l'icône orphelin car celui-ci se rend
automatiquement compte qu'aucun processus ne gère les messages
associés à cet icône. Si l'application fonctionne en mode fenêtré,
une technique pour terminer l'application proprement consiste à
mettre la fenêtre en premier plan (oShell.AppActivate
oProg.ProcessID) puis à injecter la séquence clavier "Alt+F4" via
SendKeys. Une autre technique consiste à envoyer le message Windows
WM_CLOSE à l'application via une API Win32 du genre SendMessage,
PostMessage, ... Toutefois, cette dernière solution nécessite
d'utiliser un Wrapper du type DynaWrap. En espérant avoir été
suffisamment clair ;-)



Merci Gilles et Michel. Je pense avoir tout compris. Je vais essayer une des
propositions suggérées, dès que j'aurai le temps.


--
Publicité
Poster une réponse
Anonyme