Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Bouton "Fermer" dans les HTA

6 réponses
Avatar
Patrick PALAIS
Bonjour,

c'est mon premier post ici, alors je me présente, je m'appelle Patrick, j'ai
41 ans et je suis administrateur Active Directory et Domino (oui je sais...).
Ca fait quelques temps que je recherche un moyen en VBS pour pouvoir
intercepter un click sur le bouton fermer d'une fenetre HTA (la croix blanche
sur fond rouge en hat à droite de la fenetre).
Pour palier à ca, j'ai réussi grace aux options d'en tete HTA à cacher ce
bouton et obliger les utilisateurs à cliquer sur un bouton "Quitter" dans le
formulaire, mais ce ne me convient pas plus que ca....
Si quelqu'un a une idée, grand merci d'avance.

Patrick

6 réponses

Avatar
MCI (ex do ré Mi chel la si do) [MVP]
Bonjour !

Je ne suis pas sûr que l'on puisse intercepter la fermeture de la
fenêtre.
D'autant plus qu'il faudrait également intercepter le "Menu-system" +
"Fermer" ([Alt]-espace + "fermer") ; le [Alt]-[F4] ; et, pourquoi
pas, le [Alt] [Ctrl] [Suppr]

@-salutations

Michel Claveau
Avatar
Jean
Je ne suis pas sûr que l'on puisse intercepter la fermeture de la fenêtre.


Non im n'y a pas d'évnement OnClose ou OnQuit.
Généralement on utilise l'événement OnUnload, ce qui suffit dans la
plupart des cas ... mais a utiliser avec précaution quand même.
Sa solution actuelle me semble bonne à vrai dire mais reste à savoir ce
qui le dérange dans cette solution.

Amicalement,

--
Jean - JMST
Belgium

Avatar
Patrick PALAIS
Bonjour,

merci et tous les deux pour vos réponses et félicitaiions à Jean pour son
score impressionnant aux scripting games, je suis très honoré.

Sa solution actuelle me semble bonne à vrai dire mais reste à savoir ce
qui le dérange dans cette solution.


En fait ce qui me dérange c'est que si je cache le bouton "Fermer" je cache
aussi le bouton réduire et dans une moindre mesure le bouton agrandir mais
surtout le déplacement de la fenetre. Sachant que mes HTA tournent des postes
helpdesk qui ont en permanence au minimum 20 fenetres ouvertes (des consoles
de monitoring essentiellement) je peux pas empècher ni la réduction des
fenetres, ni leur déplacement, les techniciens doivent agencer leur bureau
comme ils le souhaitent...
Ou alors pour contourner le problème, existe-t-il un moyen de cacher
uniquement le bouton fermer, ce qui rendrait alors possible le déplacement de
la fenetre et sa réduction.
Merci d'avance pour vos idées...

Patrick

Avatar
Jean
Bonjour,

merci et tous les deux pour vos réponses et félicitaiions à Jean pour son
score impressionnant aux scripting games, je suis très honoré.



Merci, j'ai vu que vous n'étiez pas en reste non plus ;-)

Sa solution actuelle me semble bonne à vrai dire mais reste à savoir ce
qui le dérange dans cette solution.


En fait ce qui me dérange c'est que si je cache le bouton "Fermer" je cache
aussi le bouton réduire et dans une moindre mesure le bouton agrandir mais
surtout le déplacement de la fenetre. Sachant que mes HTA tournent des
postes helpdesk qui ont en permanence au minimum 20 fenetres ouvertes (des
consoles de monitoring essentiellement) je peux pas empècher ni la
réduction des fenetres, ni leur déplacement, les techniciens doivent
agencer leur bureau comme ils le souhaitent...
Ou alors pour contourner le problème, existe-t-il un moyen de cacher
uniquement le bouton fermer, ce qui rendrait alors possible le déplacement
de la fenetre et sa réduction.


Non pas avec ce qui est disponible par défaut.

Je pense que le plus simple sera d'utiliser l'événement onunload.

La première chose à faire sera de gérer l'appui sur la touche F5 (
raffraichissement) qui déclenche onunload.

Ci dessous vous trouverez 2 exemples pour le faire.

Le premier annule l'appui sur la touche en utilisant simplement
l'événement onkeydown.

Le second n'annule pas l'appui sur la touche F5 mais annule le
déclenchement de l'événement onunload.
Pour ce faire il supprime le gestionnaire de l'événement onunload dans
l'événement onkeydow (pour la touche F5) et remet le gestionnaire dans
l'événement onkeyup.

La seconde chose à faire est de vérifier que le script n'utilise pas de
méthodes, fonctions qui déclenche un événement onunload.
Vous trouvez une liste de ces méthodes, fonctions dans le SDK.
Regardez ici dans la rubrique "To Invoke" de "Event Information" :
<http://msdn2.microsoft.com/en-us/library/ms536973(VS.85).aspx>

Si c'est le cas et que ça gêne il suffit généralement d'appliquer la
même technique que le second exemple : retirer le gestionnaire
d'onunload avant l'exécution de la méthode/fonction et remettre le
gestionnaire après.

A noter pour l'anecdote que la fermeture d'une fenêtre via un bouton
dans un hta peut aussi se faire en envoyant ALT + F4 avec sendkeys ...
un des rares cas où sendkeys est sûr à 100 % :-)

Voici les 2 exemples :

<!---8<---Exemple_1.HTA--->
<hta:application sysmenu=yes />

<script defer language="vbs">

With B1
.Value="Fermer"
.OnClick=GetRef("BCLK")
End With

With Window
.OnUnload=GetRef("WOUL")
.Document.OnKeyDown=GetRef("WOKD")
End With

Sub BCLK
CreateObject("WScript.Shell").SendKeys("%{F4}")
End Sub

'KeyCode 116 = touche F5

Sub WOUL
msgbox "Fermeture"
End Sub

Sub WOKD
With Window.Event
If .KeyCode6 Then .KeyCode=0
End With
End Sub
</script>

<input type=button id± />
<!---8<--->

<!---8<---Exemple_2.HTA--->
<hta:application sysmenu=yes />

<script defer language="vbs">

With B1
.Value="Fermer"
.OnClick=GetRef("BCLK")
End With

With Window
.OnUnload=GetRef("WOUL")
.Document.OnKeyDown=GetRef("WOKD")
.Document.OnKeyUp=GetRef("WOKU")
End With

Sub BCLK
CreateObject("WScript.Shell").SendKeys("%{F4}")
End Sub

Sub WOUL
msgbox "Fermeture"
End Sub

Sub WOKD
With Window.Event
If .KeyCode6 Then Window.OnUnload=""
End With
End Sub

'KeyCode 116 = touche F5

Sub WOKU
With Window.Event
If .KeyCode6 Then Window.OnUnload=GetRef("WOUL")
End With
End Sub


</script>

<input type=button id± />
<!---8<--->

Merci d'avance pour vos idées...

Patrick


Amicalement,

--
Jean - JMST
Belgium


Avatar
Jean
La première chose à faire sera de gérer l'appui sur la touche F5


A la relecture de codes il faut aussi s'occuper du menu conextuel (clic
droit) parcequ'il contient un item "Actualiser" qui déclenche onunload.

Le plus simple est de désactiver les menus contextuels avec l'attribut
ContextMenu de la balise HTA.

Sinon on peut construire ses propres menus contextuels en utilisant
l'événement OnContextMenu.
Voir exemple ci dessous qui illustre l'ajout d'un menu contextuel
permettant de raffraichir ou recharger la page sans déclencher
onunload.

<!---8<---Exemple_3.HTA--->
<hta:application sysmenu=yes />

<script defer language="vbs">
SetTimeOut "Window.Document.Body.Style.BackgroundColor=""silver""",_
1500
Menu_Actifúlse

With B1
.Value="Fermer"
.OnClick=GetRef("BCLK")
End With

With Window
.OnUnload=GetRef("WOUL")
.Document.OnKeyDown=GetRef("WOKD")
.Document.OnKeyUp=GetRef("WOKU")
.Document.OnContextMenu=GetRef("WOCM")
End With

Sub Document_OnClick
If Menu_Actif Then
Window.Document.all.MENU.RemoveNode(True)
Menu_Actifúlse
End If
End Sub

Sub BCLK
CreateObject("WScript.Shell").SendKeys("%{F4}")
End Sub

Sub WOUL
msgbox "Fermeture"
End Sub

'KeyCode 116 = touche F5

Sub WOKD
With Window
If .Event.KeyCode6 Then .OnUnload=""
End With
End Sub


Sub WOKU
With Window
If .Event.KeyCode6 Then .OnUnload=GetRef("WOUL")
End With
End Sub

Sub WOCM
If Not Menu_Actif Then Menu
Window.Event.ReturnValueúlse
End Sub

' Construction du menu contextuel
Sub Menu

Menu_Actif=True
With Window.Document
With .Body.AppendChild(.CreateElement("table"))
.Border=1
.id="MENU"
With .Style
.Position="absolute"
.Left=Window.Event.x
.Top=Window.Event.y
.BackgroundColor="lemonchiffon"
.Cursor="hand"
End With
With .InsertRow.InsertCell
.InnerText="Actualiser"
.Onclick=GetRef("Menu_Actualiser")
End With
With .InsertRow.InsertCell
.InnerText="Recharger"
.OnClick=GetRef("Menu_Recharger")
End With
With .InsertRow.InsertCell
.InnerText="Imprimer"
.OnClick=GetRef("Menu_Imprimer")
End With
End With
End With
End Sub

' Gestionnaires des clics sur les éléments du menu contextuel
Sub Menu_Actualiser
With Window
.OnUnload=""
.Document.ExecCommand("Refresh")
End With
End Sub

Sub Menu_Recharger
With Window
.OnUnload=""
.location.reload
End With
End Sub

Sub Menu_Imprimer
Window.Document.ExecCommand("Print")
End Sub

</script>
<input type=button id± />
<!---8<--->

Amicalement,

--
Jean - JMST
Belgium

Avatar
Patrick PALAIS
Jean,

merci pour ces exemples très complets, ca correspond parfaitement à ce que
je recherche.
A bientot

Patrick