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

Jean ! invisibilité HTA ?

6 réponses
Avatar
Méta-MCI
Bonjour, Jean !


Connaîtrais-tu un moyen pour qu'un HTA se rende invisible, sans appeler de
fonction "externe" ?

Lorsqu'on pilote une fenêtre IE, par COM, on a la propriété "visible = 0 ou
1", qui permet de gérer cela. Avec une fenêtre HTA, je me contentais de la
positionner en dehors de l'écran, ce qui, couplé avec showintaskbar="no"
semblait cacher la fenêtre. Mais, elle apparaît avec Alt-TAB...

J'ai bien trouvé des moyens, en appelant des outils externes (WSH ou
autres), mais une solution "interne" me conviendrait mieux.

Si tu as une solution (sans sulfites), merci d'avance...


@+

MCI

6 réponses

Avatar
Gilles LAURENT
"Méta-MCI" a écrit dans le message de
news:%
| Bonjour, Jean !

Bonjour,

Je me permets de répondre à ce message à priori privé ;-)

| Connaîtrais-tu un moyen pour qu'un HTA se rende invisible, sans
| appeler de fonction "externe" ?
|
| Lorsqu'on pilote une fenêtre IE, par COM, on a la propriété "visible
| = 0 ou 1", qui permet de gérer cela. Avec une fenêtre HTA, je me
| contentais de la positionner en dehors de l'écran, ce qui, couplé
| avec showintaskbar="no" semblait cacher la fenêtre. Mais, elle
| apparaît avec Alt-TAB...
|
| J'ai bien trouvé des moyens, en appelant des outils externes (WSH ou
| autres), mais une solution "interne" me conviendrait mieux.
|
| Si tu as une solution (sans sulfites), merci d'avance...
|
|
| @+
|
| MCI

Par curiosité, j'ai tenté de masquer totalement une fenêtre hta, sans
réussite (plusieurs heures !). Même si je lance le processus mshta en
mode "caché" alors celui-ci s'entête à créer la fenêtre de l'application
hta en mode "visible". J'ai donc fais un "tout petit ;-)" reverse
engineering et il s'avère que mshta.exe crée la fenêtre principal de
l'application hta avec le flag "SW_SHOW" accompagné du flag
"WS_VISIBLE". Donc aucune chance de masquer la fenêtre avant sa création
par cette technique. Masquer la fenêtre hta après sa création fonctionne
bien entendu mais cela n'est pas top ! J'ai donc ouvert mon compilo C
pour écrire un bout de code permettant d'injecter le processus hta dans
un desktop privé, non visible par l'utilisateur. Et là, tout semble en
ordre : Le processus mshta crée sa fenêtre "normalement" sans se soucier
du desktop ! Et bien entendu, les fenêtres filles restent cachées. Par
contre, je n'ai pas testé la communication hta "inter-desktop" ! Si vous
êtes intéressé, je peaufine le code et vous le transmets.

Note: Comment avez-vous réussi à rendre invisible une fenêtre hta en WSH
?

--
Gilles LAURENT
http://glsft.free.fr
Avatar
Michel Claveau
Bonsoir !

Note: Comment avez-vous réussi à rendre invisible une fenêtre hta en WSH


Je procède de la façon suivante :
- ouverture du HTA en position (0,-3000) (donc on ne la voit pas)
- récupération du handle de la fenêtre (ouverte, mais en dehors du
bureau)
- envoi du message SW_HIDE

Au début, je suis passé par Python. Puis, dans AutoIt, j'ai trouvé une
fonction WinSetState (cette fonction est disponible dans AutoIt natif,
comme dans AutoItX, qui peut être appelé par COM, par le HTA, qui se
cache lui-même).


Au début, je m'étais contenté de la fenêtre en dehors du bureau,
jusqu'à ce que je m'aperçoive qu'elle apparaissait quand même dans un
Alt-TAB.
Une fois invisible, elle n'y apparaît plus. Pour garder un accès, j'ai
une fenêtre IE invisible, ouverte par le HTA, qui y a injecté son
propre handle. Et, comme on peut accéder à cette fenêtre IE, même
invisible, le tour est joué (sauf avec Power-Shell, qui bloque
l'accès).


Pour l'ouverture directement en mode invisible, inutile de travailler
sur un code délicat. J'ai déjà plusieurs solutions, et mon message,
c'était juste au cas où qq (Jean, invisible en ce moment ?) connaîtrait
un truc simple que je n'aurais pas vu.


PS : J'ai abandonné le C il y a 25 ans, suite à une expérience
malheureuse...




--
@-salutations

Michel Claveau

Avatar
Jean
Connaîtrais-tu un moyen pour qu'un HTA se rende invisible, sans appeler de
fonction "externe" ?


A ma connaissance il n'y a pas de combinaison de propriétés de la
balise HTA qui permet ça.

Par contre une solution "pure scripting", qui n'utilise que des moyens
embarqués par défaut dans Windows (sans outils tiers) pourrait être la
suivante :

Exécuter le HTA via la méthode Run de WSH en mettant le paramètre
intWindowStyle sur 0.
Un pré-requis important pour que ça fonctionne : il ne faut pas
utiliser de balise <HTA /> dans le HTA !
(sinon la balise est interprétée par mshta.exe après l'exécution par
Run et redéfini la fenêtre avec les paramètres par défaut de la balise
si ils ne sont pas définis ... dans tout les cas une fenêtre qui sera
visible dans Alt+TAB).
Comme la fenêtre est invisible on ne perd pas grand chose à ne pas
mettre de balise HTA, les paramètres de configuration de la fenêtre
n'étant d'aucune utilité.
On "perd" singleinstance et commandLine ... si l'un ou l'autre
s'avérait nécessaire il faudra bricoler un peu.

On constate alors qu'au premier Alt+Tab l'icône est visible mais pas
avec les suivants.
On peut donc envoyer Alt+Tab avec la méthode SendKeys de WSH.
Pour ne pas perturber l'affichage on enverra une seconde fois Alt+Tab
afin de "revenir où on était".

Par exemple, au sein d'un HTA et en passant par la création d'un script
temporaire externe ça donne un machin comme ceci :

<!---HTA_Invisible.HTA---Jean-JMST-Belgium--->
<!--
Pré-requis : Ne pas utiliser de balise <HTA />
(Le HTA sera fermé automatiquement après 10 secondes pour la démo)
-->
<script>
moveTo(-32000,-32000)

var path_hta=location.href.replace('file:///','')

with(new ActiveXObject('Scripting.FileSystemObject')){
var fichier buildPath(getSpecialFolder(2),getFileName(path_hta)+'.js')
if(!fileExists(fichier)){
var texte='with(new ActiveXObject("WScript.Shell")){'+
' run("'+path_hta+'",0);'+
' sendKeys("%{TAB}%{TAB}")'+
'}'
with(createTextFile(fichier)){
write(texte)
close()
}
new ActiveXObject('WScript.Shell').run('"'+fichier+'"',0)
close()
}
else{
deleteFile(fichier)
}
}
</script>

<script>
//---code---
setTimeout('close()',10000)
</script>

<!---HTA_Invisible.HTA---Jean-JMST-Belgium--->

Amicalement,

--
Jean - JMST
Belgium

Avatar
Jean
On constate alors qu'au premier Alt+Tab l'icône est visible mais pas avec les
suivants.
On peut donc envoyer Alt+Tab avec la méthode SendKeys de WSH.
Pour ne pas perturber l'affichage on enverra une seconde fois Alt+Tab afin de
"revenir où on était".


J'ai trouvé mieux pour ça, sans SendKeys.
Il suffit, lorsque le HTA est exécuté avec intWindowStyle sur 0
d'exécuter une application fenêtrée.
Ceci aura pour effet de réactualiser les informations sur les icônes à
afficher pour alt+tab, l'icône du HTA sera alors retirée.
Pour être le plus discret possible j'exécute cmd.exe /c avec
intWindowStyle sur 2 (minimisé):

<!---HTA_Invisible.HTA---Jean-JMST-Belgium--->
<!--
Pré-requis : Ne pas utiliser de balise <HTA />
(Le HTA sera fermé automatiquement après 10 secondes pour la démo)
-->
<script>
moveTo(-32000,-32000)

var path_hta=location.href.replace('file:///','')

with(new ActiveXObject('Scripting.FileSystemObject')){
with(new ActiveXObject('WScript.Shell')){
var fichier buildPath(getSpecialFolder(2),getFileName(path_hta)+'.js')
if(!fileExists(fichier)){
var texte='new ActiveXObject("WScript.Shell")'+
' .run("'+path_hta+'",0)'
with(createTextFile(fichier)){
write(texte)
close()
}
run('"'+fichier+'"')
close()
}
else{
deleteFile(fichier)
run('cmd.exe /c',2)
}
}
}
</script>

<script>
//---code---
setTimeout('close()',10000)
</script>

<!---HTA_Invisible.HTA---Jean-JMST-Belgium--->

Amicalement,

--
Jean - JMST
Belgium

Avatar
Méta-MCI
Bonjour !

Je prend note des informations/façons de faire. C'est un peu tordu, mais
intéressant.
Notamment la "reprise en main" de l'affichage de la fenêtre par MSHTA, qui
explique pourquoi un lanceur invisible (comme START "" /B) ne marchait pas.

Cependant, j'apprécie certaines balises HTA, comme singleinstance="yes" ou
showintaskbar="no"


Ma (dernière) solution, pour que la fenêtre se cache elle-même, c'est :

ponx.PRun("h = win32gui.FindWindowEx(0,0,0,'TITRE-FENETRE');
win32gui.ShowWindow(h, win32con.SW_HIDE)");

(c'est juste deux lignes en Python, car Ponx permet d'exécuter du Python à
la volée)

Évidemment, il faut avoir Ponx installé. Mais, comme cette combinaison d'un
HTA et d'un IE (invisibles tous les deux), c'est justement pour offrir un
accès persistant à Ponx, pas de problème.

Et, au passage, j'ai aussi créé un exécutable, utilisable en batch, qui
permet de rendre une fenêtre (repérée par son titre), visible ou invisible.
Et toutes ces techniques fonctionnent même sur des HTA sans barre de titre,
ni menus système (le titre n'est pas visible, mais existe).

Autre info : ne pas installer Ponx en ce moment. Bien que ça fonctionne, je
suis en train de refaire tout le système de mises à jour en ligne, pour
gérer beaucoup plus de choses. Dans quelques jours, ce sera nettement mieux.


dimanche.

Michel Claveau
Avatar
Jean
Bonjour !

Je prend note des informations/façons de faire. C'est un peu tordu, mais
intéressant.
Notamment la "reprise en main" de l'affichage de la fenêtre par MSHTA, qui
explique pourquoi un lanceur invisible (comme START "" /B) ne marchait
pas.



Après quelques tests (je poste un dernier exemple en fin de message) je
dirais qu'il faut en avoir besoin et que c'est délicat à manipuler mais
c'est "jouable".
Dans les codes que j'ai posté il faudrait d'ailleurs que le contenu de
la seconde balise <script> se trouve à la fin du "else" de la première
balise <script>.

Cependant, j'apprécie certaines balises HTA, comme singleinstance="yes"


Pour tester la première exécution du HTA on peut imaginer plusieures
solutions.
Comme précédemment faire le test sur l'existence d'un fichier ou
utiliser une méthode "cookies", un test sur une valeur du registre,
via une fenêtre proxy, ...

A priori j'opterais plutôt pour le test sur une variable
d'environnement.
Dans la démo que je poste en fin de message j'utilise une variable de
type "PROCESS" nommée "HTA".

Je n'ai pas essayé mais logiquement on devrait pouvoir "simuler"
singleinstance en utilisant aussi une variable (mais qui devra
probablement alors être de type "VOLATILE")

ou showintaskbar="no"



Avec la méthode tordue sans sulfite on peut éxécuter un hta invisible
et réafficher le HTA.
Pour réafficher le HTA il suffit de faire par ex. un
document.write('<hta:application bla bla bla />'.
La démo en fin de message illustre ce fait.
Mais sans plus ... si on veux "remasquer" le HTA, il faut le fermer et
le redémarrer.


Par contre pour simuler commandLine ce sera chipo de chez chipo.


Ma (dernière) solution, pour que la fenêtre se cache elle-même, c'est :

ponx.PRun("h = win32gui.FindWindowEx(0,0,0,'TITRE-FENETRE');
win32gui.ShowWindow(h, win32con.SW_HIDE)");

(c'est juste deux lignes en Python, car Ponx permet d'exécuter du Python à
la volée)



Une fois qu'on a accès aux APIs tout devient possible :-)

Évidemment, il faut avoir Ponx installé. Mais, comme cette combinaison d'un
HTA et d'un IE (invisibles tous les deux), c'est justement pour offrir un
accès persistant à Ponx, pas de problème.



Dans ce contexte effectivement pas la peine de se tordre :-)

Et, au passage, j'ai aussi créé un exécutable, utilisable en batch, qui
permet de rendre une fenêtre (repérée par son titre), visible ou invisible.
Et toutes ces techniques fonctionnent même sur des HTA sans barre de titre,
ni menus système (le titre n'est pas visible, mais existe).



Dans le même genre je m'étais fais un ocx pour afficher une fenêtre X
"always on top"

Autre info : ne pas installer Ponx en ce moment. Bien que ça fonctionne, je
suis en train de refaire tout le système de mises à jour en ligne, pour
gérer beaucoup plus de choses. Dans quelques jours, ce sera nettement
mieux.



Il faudra que je m'y mette un jour dois-je bien avouer.
Mon (notre) ennemi c'est le temps :-)

Bon, le code/démo :

<!---HTA_Invisible.HTA---Jean-JMST-Belgium--->
<!--

Pré-requis : Ne pas utiliser de balise <HTA />

Code Démo :
-ouvre une instance IE
-> Vérifier que l'icône HTA n'est pas présente dans
Alt+Tab et est invisible dans la barre de tâches
-après 10 secondes, ferme l'instance IE et affiche le HTA
-ferme alors le HTA après 10 secondes

-->
<script>
moveTo(-32000,-32000)
var path_hta=location.href.replace('file:///','')
with(new ActiveXObject('WScript.Shell')){
with(Environment('PROCESS')){
if(!item('HTA')){
item('HTA')=true
run('"'+path_hta+'"',0)
close()
}
else{
remove('HTA')
run('cmd.exe /c',2)
//---8<---code-demo---
with(ie=new ActiveXObject('InternetExplorer.Application')){
navigate('about:blank')
while(busy){void true}
document.title='Instance IE'
setInterval('ie.document.body.innerText+="."',1000)
visible=true
}
setTimeout
(
'ie.quit();'+
'moveTo(0,0);'+
'document.write("<hta:application />");'+
'document.title="Instance HTA";'+
'document.write("Fermerture dans 10 secs.");'+
'document.write("'+
'<script>'+
'setTimeout('close()',10000)'+
'</script>'+
'")'
,10000
)
//---8<---code-demo---
}
}
}
</script>
<!---HTA_Invisible.HTA---Jean-JMST-Belgium--->



dimanche.

Michel Claveau


Amicalement,

--
Jean - JMST
Belgium