Page 1 sur 1
[R] Masquer un programme avec Alt
Posté : jeu. 02 sept. 2010 11:58
par Raz2Kill
Salut à tous,
Je suis un novice à AutoIt depuis quelques jours mais pas dans la programmation ce qui m'a permit d'avancer assez vite.
Mon script actuel lance un .exe externe et ne se quitte pas tant que le .exe n'est pas fermé.
Voici la partie du script en question (l'autre n'a aucune utilité dans le problème je pense)
Code : Tout sélectionner
$pid=Run("Prog.exe")
If ProcessWaitClose($pid) Then
ProcessClose($pid)
EndIf
Mon problème est que je souhaite cacher de la barre de tâches l'exe par une simple pression de Alt+Tab.Et bien sur à l'inverse en ré-appuyant sur Alt+Tab que le programme réapparaissent.
J4ai essayé de m'inspirer de ce topic (
http://www.autoitscript.fr/forum/viewto ... w=previous ) mais malheureusement sans succès.
Merci d'avance pour votre aide
Cordialement,
Raz2Kill
Re: [..] Masquer un programme avec Alt+Tab
Posté : jeu. 02 sept. 2010 22:00
par Tlem
Que je sache, le Alt+Tab est réservé par le système pour le basculement d'une tâche à l'autre.
Vous devriez choisir une autre combinaison de touches.
Re: [..] Masquer un programme avec Alt+Tab
Posté : jeu. 02 sept. 2010 22:12
par Raz2Kill
Dans ce cas,même chose mais juste en appuyant sur Alt?L'important est la programmation qui va derrière non?

Re: [..] Masquer un programme avec Alt+Tab
Posté : jeu. 02 sept. 2010 22:34
par Tlem
Code : Tout sélectionner
#include <Misc.au3>
$dll = DllOpen("user32.dll")
While 1
Sleep ( 250 )
If _IsPressed("12", $dll) and _IsPressed("4C", $dll) Then
Sleep(500)
MsgBox(0,"_IsPressed", "ALT + L")
Exit
EndIf
WEnd
DllClose($dll)
Re: [..] Masquer un programme avec Alt+Tab
Posté : jeu. 02 sept. 2010 23:43
par Raz2Kill
Ce code ne fait pas exactement ce qui est prévu.Il m'affiche la MsgBox et ensuite le script se termine.En revanche la fenêtre du .exe reste en place...
Il faut que le script cache temporairement le programme .exe.Je crois que celui que tu m'a donné ne fait que cacher la tray_icon
Cordialement,
Raz2Kill
Re: [..] Masquer un programme avec Alt+Tab
Posté : ven. 03 sept. 2010 00:11
par Tlem
Ce script n'est là que pour vous montrer le chemin.
Comme vous l'avez dit :
L'important est la programmation qui va derrière
Vous savez comment gérer la/les touches, donc maintenant vous devez chercher comment réduire une fenêtre.
Pour réduire une fenêtre, le mieux est d'avoir son handle.
Donc transformez le PID en Handle (
http://www.autoitscript.fr/forum/viewto ... =21&t=5411).
Ensuite, vous devez indiquer l'état de la fenêtre avec
WinSetState (au lieu du titre de la fenêtre, utilisez son handle.

).
Et voilà ...
PS : J'ai supprimé la citation du code dans votre message, car le bouton citation n'est à utiliser uniquement pour souligner certaines phrases ou paragraphes
lorsque cela est nécessaire.
Ici, en l'occurrence, votre message est après le miens, donc inutile de reprendre l'intégralité de mon message ...
Re: [..] Masquer un programme avec Alt+Tab
Posté : ven. 03 sept. 2010 08:42
par Raz2Kill
Après avoir bouillonné tout ça j'en arrive à un beau script bien long que voici
Code : Tout sélectionner
Func _GetHwndFromPID($PID)
$hWnd = 0
$stPID = DllStructCreate("int")
Do
$winlist2 = WinList()
For $i = 1 To $winlist2[0][0]
If $winlist2[$i][0] <> "" Then
DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $winlist2[$i][1], "ptr", DllStructGetPtr($stPID))
If DllStructGetData($stPID, 1) = $PID Then
$hWnd = $winlist2[$i][1]
ExitLoop
EndIf
EndIf
Next
Sleep(100)
Until $hWnd <> 0
Return $hWnd
EndFunc ;==>_GetHwndFromPID
#include <Misc.au3>
$dll = DllOpen("user32.dll")
While 1
Sleep ( 250 )
If _IsPressed("12", $dll) and _IsPressed("4C", $dll) Then
MsgBox(0,"HideProject", "Ok to test...")
WinSetState ( "hWnd", "", @SW_HIDE )
EndIf
Exit
WEnd
Cependant après la MsgBox,plus rien ne se passe.
De plus,
If ProcessWaitClose($pid) Then
ProcessClose($pid)
EndIf
Ne fonctionne plus,je doit remplacer le PID par le handle je suppose?
Mais j'ai du mal à comprendre quel est le handle....
Cordialement,
Raz2Kill
Re: [..] Masquer un programme avec Alt+Tab
Posté : ven. 03 sept. 2010 08:48
par Tlem
Par convention et facilité de lecture du code, placez vos fonctions à la fin du code.
En ce qui concerne votre question, je ne comprend pas ce que vous cherchez à faire avec le
ProcessWaitClose.
Sinon, en ce qui concerne l'argument de la commande, je pense que la documentation est claire :
ProcessWaitClose
ProcessWaitClose ( "process" [, timeout] )
process The name or PID of the process to check
timeout [optional] Specifies how long to wait (in seconds). Default is to wait indefinitely
Re: [..] Masquer un programme avec Alt+Tab
Posté : ven. 03 sept. 2010 11:52
par Raz2Kill
Le ProcessWaitClose est là pour fermer le script quand je quitte le .exe
Mais dois-je mettre ProcessWaitClose ( "process" [, timeout] ) à la place?
Si je le met en place,je n'arrive pas à trouver le "process",y a-t-il un rapport avec les processus dans le gestionnaire de tâches?
En ce qui concerne le handle,je n'ai toujours pas saisis ce qu'il fallait mettre dans le "_ICI_"
WinSetState ( "_ICI_", "", @SW_HIDE )
EDIT:Finalement j'ai réussi à le faire fonctionner.La fenêtre disparait bien comme y faut
Il faut maintenant que lorsque j'appuie sur Alt+L cela la fasse réapparaittre et tout sera nikel chrome
On va y arriver
EDIT2:J'essaye de placer le code pour relancer la fenêtre du .exe mais je n'arrive pas à le positionner de façon à cela soit pris en compte seulement lorsqu'elle a été caché...
Voici ce que j'ai tenté sans succès:
While 1
Sleep ( 250 )
If _IsPressed("12", $dll) Then
MsgBox(0,"HideProject", "Ok to test")
WinSetState ( "Fenêtre exe", "", @SW_HIDE )
If _IsPressed("12", $dll) Then
MsgBox(0,"HideProject", "Hide end")
WinSetState ( "Fenêtre exe", "", @SW_SHOW )
Endif
EndIf
WEnd
Cordialement,
Raz2Kill
Re: [..] Masquer un programme avec Alt+Tab
Posté : ven. 03 sept. 2010 16:52
par Tlem
Je pense que nous gagnerons du temps tout les deux si je vous donne un code fonctionnel.
► Afficher le texte
Code : Tout sélectionner
#include <Misc.au3>
$App = @WindowsDir & "\Notepad.exe" ; L'application à lancer
$dll = DllOpen("user32.dll") ; Utilisation pour _IsPressed
$PID = Run($App, "") ; On lance le programme et on récupère son PID.
$Hwnd = _GetHwndFromPID($PID) ; A l'aide du PID, on récupère le handle de l'application
While 1
Sleep ( 50 )
If _IsPressed("12", $dll) and _IsPressed("4C", $dll) Then ; On test si ALT + L
If BitAnd(WinGetState($Hwnd, ""), 16) Then ; On vérifie l'état de la fenêtre (si minimisée).
WinSetState($Hwnd, "", @SW_RESTORE) ; Si la condition précédente est vérifiée alors on restore la fenêtre.
Else
WinSetState($Hwnd, "", @SW_MINIMIZE) ; Sinon on la minimize.
EndIf
Sleep(1000)
EndIf
If Not ProcessExists($PID) Then Exit ; Si le process n'existe plus alors ou quitte le script.
WEnd
; Fonction pour récupérer le handle d'une application grace au PID de celle-ci.
Func _GetHwndFromPID($PID)
$hWnd = 0
$stPID = DllStructCreate("int")
Do
$winlist2 = WinList()
For $i = 1 To $winlist2[0][0]
If $winlist2[$i][0] <> "" Then
DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $winlist2[$i][1], "ptr", DllStructGetPtr($stPID))
If DllStructGetData($stPID, 1) = $PID Then
$hWnd = $winlist2[$i][1]
ExitLoop
EndIf
EndIf
Next
Sleep(100)
Until $hWnd <> 0
Return $hWnd
EndFunc ;==>_GetHwndFromPID
Re: [..] Masquer un programme avec Alt+Tab
Posté : ven. 03 sept. 2010 18:21
par Raz2Kill
Merci pour le code final cependant un bémol reste présent,rien ne se passe lorsque j'appuie sur Alt+L.J'ai placé des MsgBox pour voir si il avait au moins une réaction du script lors de la pression mais rien ne se passe.
Cordialement,
Raz2Kill
Re: [..] Masquer un programme avec Alt+Tab
Posté : ven. 03 sept. 2010 18:22
par Tlem
Ce code fonctionne parfaitement sur mon PC (Windows XP SP3).
Donc à ce stade, je ne peut vous aider plus. Vous devez chercher de votre coté.
Re: [..] Masquer un programme avec Alt+Tab
Posté : ven. 03 sept. 2010 22:04
par Raz2Kill
Effectivement j'ai essayé avec un autre .exe et cela fonctionne.Je verrais ce problème par la suite...J'utilise cependant WinSetState($Hwnd, "", @SW_HIDE) au lieu de WinSetState($Hwnd, "", @SW_MINIMIZE)
En revanche la réapparition de fonctionne pas. WinSetState($Hwnd, "", @SW_SHOW) n'a aucun effet.D'après la ocumentation (
http://www.autoitscript.fr/autoit3/docs ... tState.htm),@SW_SHOW restaure "la fenêtre cacher précédemment".Arrête moi si je me trompe,cela veut dire que c'est la boucle qui cause le problème de "précédemment indéfini" ?
Cordialement,
Raz2Kill
Re: [..] Masquer un programme avec Alt+Tab
Posté : ven. 03 sept. 2010 22:31
par Tlem
Vous oubliez cette ligne :
Code : Tout sélectionner
If BitAnd(WinGetState($Hwnd, ""), 16) Then ; On vérifie l'état de la fenêtre (si minimisée).
Lorsque votre fenêtre est cachée, elle n'est pas minimisée ...
Donc la condition n'est pas vraie.
Vous devez inverser le test et utiliser d'autres valeur que 16.

Re: [..] Masquer un programme avec Alt+Tab
Posté : ven. 03 sept. 2010 23:14
par Raz2Kill
Oui ce n'est pas faux
Je me suis renseigné à ce propos (
http://www.adminscripteditor.com/syntax ... t=v&id=614) et ai choisis "1 = Window exists " mais rien n'y fait cela plante le script et la fenêtre ne veut même pas se cacher.Je dois bien remplacer le 16 par 1?
Cordialement,
Raz2Kill
Re: [..] Masquer un programme avec Alt+Tab
Posté : ven. 03 sept. 2010 23:24
par Tlem
Extrait de la documentation de la commande
WinGetState :
Return Value
Success: Returns a value indicating the state of the window. Multiple values are added together so use BitAND() to examine the part you are interested in:
1 = Window exists
2 = Window is visible
4 = Window is enabled
8 = Window is active
16 = Window is minimized
32 = Window is maximized
Failure: Returns 0 and sets @error to 1 if the window is not found.
Faites votre choix.
Sachez que vous pouvez additionner des valeurs afin de correspondre à différente conditions.

Re: [..] Masquer un programme avec Alt+Tab
Posté : sam. 04 sept. 2010 00:18
par Raz2Kill
J'ai justement essayé mais rien ne fonctionne!Je crois m'être emmêlé les pinceaux sur la position de If BitAnd(WinGetState($Hwnd, ""), X)
Et lorsque vous dîtes que je peut additionner cela signifie mettons X=1+4+8=13?
Je ne saisis pas trop
Cordialement,
Raz2Kill
Re: [..] Masquer un programme avec Alt+Tab
Posté : sam. 04 sept. 2010 09:25
par Tlem
L'information sur le fait de pouvoir additionner les nombres, n'était là que pour information. Le but était de vous expliquer qu'il était possible de contrôler plusieurs condition en même temps ...
Pour votre cas, remplacez la boucle de mon exemple précédent par celle-ci

:
► Afficher le texte
Code : Tout sélectionner
While 1
Sleep ( 50 )
If _IsPressed("12", $dll) and _IsPressed("4C", $dll) Then ; On test si ALT + L
If BitAnd(WinGetState($Hwnd, ""), 2) Then ; On vérifie l'état de la fenêtre (si minimisée).
WinSetState($Hwnd, "", @SW_HIDE) ; Si la condition précédente est vérifiée alors on restore la fenêtre.
Else
WinSetState($Hwnd, "", @SW_SHOW) ; Sinon on la minimize.
EndIf
Sleep(1000)
EndIf
If Not ProcessExists($PID) Then Exit ; Si le process n'existe plus alors ou quitte le script.
WEnd
Re: [..] Masquer un programme avec Alt+Tab
Posté : lun. 06 sept. 2010 18:42
par Raz2Kill
Effectivement cette fois-ci tout fonctionne.Je revoit le script final en additionnant ces lignes et vous donne un résultat
EDIT:Je ne comprend vraiment pas.Le script fonctionne avec un autre .exe mais celui pour lequel j'ai besoin du script ne veut pas se cacher alors qu'il voulait bien avant
Il démarre bien mais refuse tout chose lors de la pression de Alt+L
EDIT2:En regardant de plus près sur la tray_icon lorsque le script est en route,celui-ci se met en pause tout seul (avec la petite croix rouge) et lorsque je ferme le .exe,le script reste ouvert en pause
EDIT3:Après quelque bidouilles par-ci par là,je me suis rendu compte que c'est le .exe en question qui ne doit pas être compatible avec le handle.Du coup en re-basant tout sur la prise en compte du titre de la fenêtre et du PID normale,tout roule!Je donne les lignes si cela peut servir à quelqu'un,non pas avec Alt+L mais juste Alt (plus près de ce dont j'avais besoin finalement...)
Code : Tout sélectionner
#include <Misc.au3>
$dll = DllOpen("user32.dll")
$PID = Run("Programme.exe", "")
While 1
Sleep ( 100 )
If _IsPressed("12", $dll) Then
If BitAnd(WinGetState("Titre de la fenêtre", ""), 2) Then
WinSetState("Titre de la fenêtre", "", @SW_HIDE)
Else
WinSetState("Titre de la fenêtre", "", @SW_SHOW)
EndIf
Sleep(100)
EndIf
If Not ProcessExists($PID) Then Exit
WEnd
Merci à toi Tlem nous avons fini par y arriver
Cordialement,
Raz2Kill