Salut,
Apres de très rapides recherches, je n'ai pas trouvé de solution pour gérer plusieurs TrayIcon.
Je suis parti sur une solution qui consiste à exécuter simultanément plusieurs fois ton script, avec différents arguments (paramètres).
Pour résumer, tu exécute ton script (à priori sans paramètres),
- après vérification qu'il est bien le programme maître (aucun paramètre, càd $cmdline[0] = 0)
- il s’exécute avec le paramètre 2
- il s’exécute avec le paramètre 3
- on active l’exécution de la fonction ToutFermer() quand le programme va s’éteindre
- il fait ce qu'il a à faire (surveillance de NumLock par exemple)
- Si il doit fermer (exit dans le menu, le gestionnaire de taches l’arrête, ou autre), alors il ferme les deux autres icônes
Si le programme à un argument ($cmdline <> 0) alors
- si l'argument est 2 ($cmdline = 2)
- surveillance de CapsLock sans s'inquiéter de devoir s'éteindre (le maître s'en occupe)
Si le programme à un argument ($cmdline <> 0) alors
- si l'argument est 3 ($cmdline = 3)
- surveillance de DefilLock sans s'inquiéter de devoir s'éteindre (le maître s'en occupe)
Code : Tout sélectionner
#NoTrayIcon;pour ne pas avoir de problèmes
#include <TrayConstants.au3> ; Required for the $TRAY_ICONSTATE_SHOW constant.
Opt("TrayMenuMode", 3) ; The default tray menu items will not be shown and items are not checked when selected. These are options 1 and 2 for TrayMenuMode.
Global $TrayPID2 = -1
Global $TrayPID3 = -1
If $cmdline[0] = 0 Then
;Programme Maître
Local $idAbout = TrayCreateItem("About");menu facultatif
TrayCreateItem("") ; Create a separator line.
Local $idExit = TrayCreateItem("Exit")
TraySetState($TRAY_ICONSTATE_SHOW) ; Show the tray menu.
If @Compiled Then
$TrayPID2 = ShellExecute(@ScriptFullPath,2);à verifier
$TrayPID3 = ShellExecute(@ScriptFullPath,3)
Else
$TrayPID2 = ShellExecute(@AutoItExe,'"' & @ScriptFullPath & '" 2');ça fonctionne, même si il y a des espaces dans le chemin d'acces
$TrayPID3 = ShellExecute(@AutoItExe,'"' & @ScriptFullPath & '" 3')
EndIf
OnAutoItExitRegister("ToutFermer");si le script s'éteint, on éteint les deux autres
While 1
;il faut ajouter ici ce qu'il faut les tests pour verifier l'état du NumLock et les actions associées
Switch TrayGetMsg()
Case $idAbout ; Display a message box about the AutoIt version and installation path of the AutoIt executable.
MsgBox(0, "", "Process Principal") ; Find the folder of a full path.
Case $idExit ; Exit the loop.
;tu peux ajouter ici ToutFermer() , mais ce n'est pas obligatoire car la fonction sera forcément exécutée quand le programme va s'arreter
ExitLoop;ou Exit
EndSwitch
WEnd
Else
If $cmdline[1] = 2 Then
;deuxième programme
Local $idAbout = TrayCreateItem("About");facultatif
TrayCreateItem("") ; Create a separator line.
TraySetState($TRAY_ICONSTATE_SHOW) ; Show the tray menu.
TraySetIcon("C:\WINDOWS\system32\shell32.dll",12);on change l'icone pour le différencier du premier et du troisième
While 1
Switch TrayGetMsg()
;ici la surveillance de CapsLock
Case $idAbout
MsgBox(0, "", "Tray 2")
EndSwitch
WEnd
ElseIf $cmdline[1] = 3 Then
;troisième programme
;identique au deuxième, sauf qu'il surveille autre chose
Local $idAbout = TrayCreateItem("About")
TrayCreateItem("")
TraySetState($TRAY_ICONSTATE_SHOW)
TraySetIcon("C:\WINDOWS\system32\shell32.dll",10)
While 1
Switch TrayGetMsg()
Case $idAbout
MsgBox(0, "", "Tray 2")
EndSwitch
WEnd
EndIf
EndIf
Func ToutFermer()
ProcessClose($TrayPID2);kill du deuxième icone
ProcessClose($TrayPID3);kill du troisième
EndFunc
Ce code permet de tout mettre dans un seul programme, mais tu peux en faire trois différents et oublier les histoires de paramètres.
Dans ces deux cas ton programme apparaîtra trois fois dans le gestionnaire des taches.
J’espère que c'es ce que tu cherches.