Je viens de réaliser une IconTray que j'ai bien entendu compilée afin de pouvoir la diffuser dans mon agence.
Pour cet utilitaire, j'utilise plusieurs includes
► Afficher le texteLe code de mon IconTray
Code : Tout sélectionner
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <ModernMenu.au3>
#include <StaticConstants.au3> ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include <FileListToArrayXT.au3>
Global $MonDir = @ProgramFilesDir & "\sumi"
Global $title = "La boîte à raccourcis SUMI"
Global $ScName = @SCRIPTNAME
Global $MajDir = "\\SRV\Doss\"
Global $ver = FileGetVersion(@ScriptFullPath)
Global $ver_maj = FileGetVersion($MajDir & $ScName)
; Variable globale de stockage des commandes
Global $commands = 0
; Le fichier spécifié n'existe pas
If Not FileExists($MonDir) Then Exit (2)
; Définition de l'icône
Global $TrayIcon1 = 0
Global $TrayMaj = 0
Global $ExitGui = 0
Global $aboutItem = 0
Global $Actual = 0
Global $ExitItem = 0
Global $MajItem = 0
Global $HelpItem = 0
CreateTray()
VerifMaj()
; Entrée dans la boucle principale de l'application
; (attente d'une action sur le menu
While 1
Sleep(10)
WEnd
Exit
Func CreateTray()
Opt("GUIOnEventMode", 1) ; récupère les évènements du tray et du GUI à propos
$id = 0
$TrayIcon1 = _TrayIconCreate($title, @ScriptFullPath, -1, "MonCallBack")
$commands = ObjCreate("Scripting.Dictionary")
; comportement des boutons sur l'IconTray
_TrayIconSetclick(-1, 18) ;cf TraySetClick
_TrayIconSetState($TrayIcon1) ; On affiche l'IconTray
$TrayMenu1 = _TrayCreateContextMenu()
; création de la barre Boite à rac
$CoteItem1 = _CreateSideMenu($TrayMenu1)
_SetSideMenuText($CoteItem1, "Boîte à raccourcis")
_SetSideMenuColor($CoteItem1, 0x00FFFF)
_SetSideMenuBkColor($CoteItem1, 0x802222)
_SetSideMenuBkGradColor($CoteItem1, 0x4477AA)
;Définition des couleurs des menus
_SetTrayBkColor(0xFFD8C0)
_SetTrayIconBkColor(0xEE8877)
_SetTrayIconBkGrdColor(0x703330)
_SetTraySelectBkColor(0x662222)
_SetTraySelectRectColor(0x4477AA)
_SetTraySelectTextColor(0x66FFFF)
_SetTrayTextColor(0x000000)
; On recherch tous les sous dossier pour créer les Menus tray
$T_Dossier = _FileListToArrayXT($MonDir, "*", 2, 1, True, "", 0)
$T_Fichier = _FileListToArrayXT($MonDir, "*", 1, 1, True, "", 0)
_ArraySort($T_Dossier, 0)
_ArraySort($T_Fichier, 0)
; définition du tableau d'index des commandes
Global $mFich[UBound($T_Dossier)]
; On commence par créer les menus correspondant aux dossiers
For $i = 0 To UBound($T_Dossier) - 1
$j = $i - 1
$parent = -1
$LabelMenu = StringSplit($T_Dossier[$i], "\")
If $i > 0 Then
If StringInStr($T_Dossier[$i], $T_Dossier[$j]) Then
; c'est un sous dossier du précédent
$parent = $mFich[$i - 1]
EndIf
EndIf
$id = _TrayCreateMenu($LabelMenu[$LabelMenu[0]], $parent)
$mFich[$i] = $id
;_ArrayAdd($mFich, $id)
$icone = IcoDos($MonDir & "\" & $T_Dossier[$i])
If $icone[0] = "" Then
_TrayItemSetIcon($id, "", 0)
Else
_TrayItemSetIcon($id, $icone[0], -$icone[1])
_TrayItemSetSelIcon($id, "shell32.dll", -44)
EndIf
_TrayCreateItem("", $parent)
_TrayItemSetIcon(-1, "", 0)
Next
For $f = 0 To UBound($T_Fichier) - 1
$fich = $T_Fichier[$f]
; Recherche de l'extention
$ext = StringRight($fich, 3)
; Si on a à faire à un raccourci
If $ext = "lnk" Or $ext = "url" Then
; Par défaut, on crée l'Item à la racine du SumiTray
$parent = -1
; On récupère le nom de fichier sans le chemin
$file = StringSplit($fich, "\")
$filename = $file[$file[0]]
; On récupère le nom de fichier sans l'extension
$pos = StringSplit($filename, ".")
$caption = $pos[1]
; On recherche les identifiant de l'icone
$icone = MonIcone($MonDir, $fich)
$indx = $icone[1] + 1
For $d = 0 To UBound($T_Dossier) - 1
If StringInStr($fich, $T_Dossier[$d]) Then
$parent = $mFich[$d]
EndIf
Next
$id = _TrayCreateItem($caption, $parent)
_TrayItemSetIcon($id, $icone[0], -$indx)
$cmd = $MonDir & "\" & $fich
If $cmd <> "" Then
$commands.item($id) = $cmd
GUICtrlSetOnEvent($id, "MenuEvents")
EndIf
EndIf
Next
; Création des items "system" (avant la commande "Quitter"
_TrayCreateItem("")
_TrayItemSetIcon(-1, "", 0)
$Actual = _TrayCreateItem("Actualiser")
_TrayItemSetIcon($Actual, @ScriptFullPath, -5)
GUICtrlSetOnEvent(-1, "MenuEvents")
$MajItem = _TrayCreateItem("Vérifier MAJ")
_TrayItemSetIcon($MajItem, @ScriptFullPath, -8)
GUICtrlSetOnEvent(-1, "MenuEvents")
; Création du séparateur final (avant la commande "Quitter"
_TrayCreateItem("")
_TrayItemSetIcon(-1, "", 0)
If FileExists("\\SRV\SUMITRAY_personnaliser.pdf") Then
; Création d'un item A propos
$HelpItem = _TrayCreateItem("Un peu d'aide ?")
_TrayItemSetIcon($HelpItem, @ScriptFullPath, -6)
$commands.item($HelpItem) = "http://SRV/SUMITRAY_personnaliser.pdf"
GUICtrlSetOnEvent($HelpItem, "MenuEvents")
EndIf
; Création d'un item A propos
$aboutItem = _TrayCreateItem("A propos")
_TrayItemSetIcon($aboutItem, @ScriptFullPath, -6)
GUICtrlSetOnEvent($aboutItem, "MenuEvents")
; Création de l'élément "Quitter" qui sera toujours présent
; quelque soit le fichier XML et ce qu'il contient
;TrayCreateItem("Quitter")
;TrayItemSetOnEvent(-1, "ExitScript")
$ExitItem = _TrayCreateItem("Quitter")
_TrayItemSetIcon($ExitItem, @ScriptFullPath, -7)
GUICtrlSetOnEvent(-1, "MenuEvents")
; Création de la boîte de dialogue A propos
Global $AboutGUI = GUICreate("À propos...", 200, 135)
;La chaine affichée
$strAbout1 = "System Tray " & @CRLF & "Version : " & $ver
$strAbout2 = "Créé par : " & @CR & " Moi" & @CRLF
$strAbout2 = $strAbout2 & " avec AutoIt version " & @AutoItVersion
;$strAbout = $strAbout & "
;On ferme
GUISetIcon(@ScriptFullPath)
GUISetOnEvent($GUI_EVENT_CLOSE, "MenuEvents")
GUICtrlCreateIcon(@ProgramFilesDir & "\Ico_.icl", 12, 5, 5)
GUICtrlCreateLabel($strAbout1, 40, 5, 150, 50, $SS_CENTER)
GUICtrlCreateLabel($strAbout2, 40, 51, 150, 50)
$ExitGui = GUICtrlCreateButton("OK", 75, 110, 50, 20)
GUICtrlSetOnEvent(-1, "MenuEvents")
EndFunc ;==>CreateTray
; Détermine quelle est l'icone du raccourci
; sous la forme d'un tableau
; $ico[0] = fichier
; $ico[1] = index
Func MonIcone($Rep, $racc)
Local $ico[2]
$var = StringRight($racc, 3)
$ico[0] = "Indéterminé"
$ico[1] = "Indéterminé"
If $var = "lnk" Then
; Lien vers un dossier
$lien = FileGetShortcut($Rep & "\" & $racc)
If $lien[4] = "" Then
$ico[0] = $lien[0]
$ico[1] = 0
Else
$ico[0] = $lien[4]
$ico[1] = $lien[5]
EndIf
ElseIf $var = "url" Then
$lien = FileGetUrl($Rep & "\" & $racc)
$ico[0] = $lien[1]
$ico[1] = $lien[2]
EndIf
Return $ico
EndFunc ;==>MonIcone
; Récupère les informations d'un raccourcis de type URL
; $url[1]= fichier icone
; $url[2]= index icone
Func IcoDos($dos)
Local $url[2]
If FileExists($dos & "\Desktop.ini") Then
$url[0] = IniRead($dos & "\Desktop.ini", ".ShellClassInfo", "IconFile", "shell32.dll")
$url[1] = IniRead($dos & "\Desktop.ini", ".ShellClassInfo", "IconIndex", 4)
Else
$url[0] = "shell32.dll"
$url[1] = 4
EndIf
Return $url
EndFunc ;==>IcoDos
; Récupère les informations d'un raccourcis de type URL
; $url[0]= cible
; $url[1]= fichier icone
; $url[2]= index icone
Func FileGetUrl($filename)
Local $url[3]
$H_Fil = FileOpen($filename, 0)
While 1
$Ligne = FileReadLine($H_Fil)
If @error = -1 Then ExitLoop
; On recherche la section InternetShortcut
$pos = StringSplit($Ligne, "=")
Switch $pos[1]
Case "IconFile"
$url[1] = $pos[2]
Case "IconIndex"
$url[2] = $pos[2]
Case "URL"
$url[0] = $pos[2]
EndSwitch
WEnd
FileClose($H_Fil)
Return $url
EndFunc ;==>FileGetUrl
Func MenuEvents()
Global $Msg = @GUI_CtrlId
Local $cmd = $commands.Item($Msg)
Switch $Msg
Case $GUI_EVENT_CLOSE, $ExitGui
; On ferme le A propos
GUISetState(@SW_HIDE)
Case $aboutItem
about()
Case $Actual
;_TrayIconSetState($TrayIcon1, 2) ; Hide icon
$nProc = ProcessExists(@ScriptName)
Run(@ScriptFullPath, @ScriptDir)
_TrayIconDelete($TrayIcon1)
ProcessClose($nProc)
Case $ExitItem
ExitScript()
Case $MajItem
VerifMaj(True)
Case Else
ShellExecute($cmd)
EndSwitch
EndFunc ;==>MenuEvents
; about
Func about()
; Il faut créer une GUI pour afficher le a propos (plus propre que le msgbox)
GUISetState()
EndFunc ;==>about
; Quitte l'application
Func ExitScript()
If IsDeclared("TrayIcon1") Then
;MsgBox(0,"Déclaré","TrayIcon1")
_TrayIconDelete($TrayIcon1)
EndIf
Exit (0)
EndFunc ;==>ExitScript
Func VerifMaj($Force = False)
if ($ver_maj > $ver) Then
$str_tip = "La version " & $ver_maj & " est disponible !" & @CRLF
$str_tip = $str_tip & "Cliquez ici pour l'installer."
If $TrayMaj = 0 Then
$TrayMaj = _TrayIconCreate($title, @ScriptFullPath, -8, "MonCallBack")
_TrayIconSetState(-1, 5) ; Show icon and start flashing -> 1 + 4
EndIf
_TrayTip($TrayMaj, "SumiTray " & $ver, $str_tip, 10, 1)
ElseIf $Force Then
$str_tip = "Aucune mise à jour n'est disponible."
_TrayTip($TrayIcon1, "SumiTray " & $ver, $str_tip, 10, 1)
EndIf
EndFunc ;==>VerifMaj
Func MiseAJour()
$str_maj = "Vous êtes actuellement en version" & $ver & @CRLF & @CRLF
$str_maj = $str_maj & "Êtes-vous sur de vouloir mettre à jour votre SumiTray ?"
$rMaj = MsgBox(36, "Mise à jour disponible", $str_maj)
If ($rMaj = 6) Then
; Il faut lancer le programme de Maj avec le dossier du fichier actuel en paramètre
If IsDeclared("TrayIcon1") Then
_TrayIconDelete($TrayIcon1)
EndIf
$InstDir = @ScriptDir
Run($MajDir & "\maj_sumitray.exe " & $InstDir & "", @DesktopDir, @SW_SHOWDEFAULT)
EndIf
EndFunc ;==>MiseAJour
Func MonCallBack($nID, $nMsg)
Switch $nID
Case $TrayMaj
Switch $nMsg
Case $NIN_BALLOONUSERCLICK, $NIN_BALLOONTIMEOUT
_TrayIconSetState($TrayMaj, 8) ; Stop icon flashing
If $nMsg = $NIN_BALLOONUSERCLICK Then
MsgBox(0, "MAJ Demandée", "Vous avez demandé une MAJ ne quittez pas !")
MiseAJour()
EndIf
_TrayIconSetState($TrayMaj, 2) ; Hide icon
EndSwitch
EndSwitch
EndFunc ;==>MonCallBack
J'ai bien essayé de décripter les info données dans la console de débuggage, mais je ne vois aucune erreur. Les includes semblent bien se déroulerLine xxx (File "MonFichier.exe") :
Error : Array variable subscript badly formatted
► Afficher le texteLe résultat sur la console
>"C:\Program Files\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /ShowGui /in "\\SRV\Doss\sumitray0.3.au3"
+>15:57:08 Starting AutoIt3Wrapper v.2.0.1.24 Environment(Language:040C Keyboard:0000040C OS:WIN_XP/Service Pack 2 CPU:X64 OS:X86)
-> 1 Change(s) made.
>Running AU3Check (1.54.19.0) params:-v 1 from:C:\Program Files\AutoIt3
Include search-path : C:\Program Files\AutoIt3\Include
\\SRV\Doss\sumitray0.3.au3(16,1) : INCLUDE: "C:\Program Files\AutoIt3\Include\GUIConstantsEx.au3"
\\SRV\Doss\sumitray0.3.au3(17,1) : INCLUDE: "C:\Program Files\AutoIt3\Include\ModernMenu.au3"
\\SRV\Doss\sumitray0.3.au3(18,1) : INCLUDE: "C:\Program Files\AutoIt3\Include\StaticConstants.au3"
\\SRV\Doss\sumitray0.3.au3(19,1) : INCLUDE: "C:\Program Files\AutoIt3\Include\Array.au3"
\\SRV\Doss\sumitray0.3.au3(20,1) : INCLUDE: "C:\Program Files\AutoIt3\Include\FileListToArrayXT.au3"
+>15:57:18 AU3Check ended.rc:0
>Running:(3.3.6.0):C:\Program Files\AutoIt3\aut2exe\aut2exe.exe /in "\\SRV\Doss\sumitray0.3.au3" /out "\\SRV\Doss\SumiTray_0300.exe" /nopack /icon "%urserprofile%\Mes documents\Axialis Librarian\Icônes\cete\SUMI.ico" /comp 2
+>15:57:21 Aut2exe.exe ended.rc:0
>15:57:21 Performing the Program Resource Update steps:
...>Updating Program Version information.
...>Adding 5 Icon(s).
+>15:57:22 Program Resource updating finished successfully.rc:0
>Running:(3.3.0.0):C:\Program Files\AutoIt3\aut2exe\upx.exe" --best --compress-icons=0 -qq "\\SRV\Doss\SumiTray_0300.exe"
787369 -> 442281 56.17% win32/pe SumiTray_0300.exe
+>15:57:23 UPX Ended: rc:0
+>15:57:23 Created program:\\SRV\Doss\SumiTray_0300.exe
->15:57:23 Warning: This is an Unicode compiled script and will not run on Win9x/ME.
>Exit code: 0 Time: 15.917
J'utilise la version 3.3.6.0 d'autoit (et bien sur aucune version sur les autres postes).



