Pour illustrer partiellement (
je ne me suis pas occupé de chercher l'icone de l'application externe) les propos de Nico avec l'application Calculette.
Lance la calculette puis le code ci-dessous.
La touche F8 permet d'afficher ou montrer l'application externe.
L'icone de l'application externe ne sera pas affichée dans la barre des taches.
Un menu contextuel(popup) est associé à l'icone affichée dans la zone de notification.
Quand on ferme cette icone, l'icone de l'application externe apparaît de nouveau dans la barre des taches.
Code : Tout sélectionner
;Mette une application externe dans la zone de notification (Systray)
;Contributeur : Falsam (01 mars 2013)
;
; OS : Windows
Enumeration
#Mainform ;Fenetre de l'application qui restera invisible
#MenuPopUp;Menu contextuel de l'icone figurant dans la zone de notification
EndEnumeration
;Handle de l'application externe
Global ExeHwnd.l
;Status de l'application externe
;#False : L'application est cachée
;#True : L'application est visible
Global ExeStatus.b
;Affiche ou pas le programme externe (Thread)
;On a choisi la touche F8 pour cacher ou afficher l'application externe
Procedure ExeShowHide(*Value)
Repeat
If GetAsyncKeyState_(#VK_F8) & $1
If ExeStatus = #False
;L'application externe est cachée -> Affichage de l'application
ExeStatus = #True
ShowWindow_(ExeHwnd, #SW_SHOW)
Else
;L'application externe est visible -> Cacher l'application
ShowWindow_(ExeHwnd, #SW_HIDE)
ExeStatus = #False
EndIf
EndIf
ForEver
EndProcedure
;Supprime l'icone de l'application extene de la barre des tache by (TsSoft)
Procedure HideFromTaskBar(ExeHwnd.l, Flag.l)
Protected TBL.ITaskbarList
CoInitialize_(0)
If CoCreateInstance_(?CLSID_TaskBarList, 0, 1, ?IID_ITaskBarList, @TBL) = #S_OK
TBL\HrInit()
If Flag
TBL\DeleteTab(ExeHwnd)
Else
TBL\AddTab(ExeHwnd)
EndIf
TBL\Release()
EndIf
CoUninitialize_()
DataSection
CLSID_TaskBarList:
Data.l $56FDF344
Data.w $FD6D, $11D0
Data.b $95, $8A, $00, $60, $97, $C9, $A0, $90
IID_ITaskBarList:
Data.l $56FDF342
Data.w $FD6D, $11D0
Data.b $95, $8A, $00, $60, $97, $C9, $A0, $90
EndDataSection
EndProcedure
;Start
Procedure Start()
;Fenetre de l'application
OpenWindow(#MainForm, 0, 0, 0, 0, "", #PB_Window_Invisible)
;Menu pour le sytray
CreatePopupMenu(#MenuPopUp)
MenuItem(0, "Afficher la fenetre")
MenuItem(1, "Quitter")
;Cache la fenetre principale
HideWindow(#Mainform, #True)
;Ajoute une icône et un texte d'aide dans la zone de notification
AddSysTrayIcon(1, WindowID(#Mainform), LoadIcon_(#Null, #IDI_WARNING))
SysTrayIconToolTip(1, "Touche F8" +#CRLF$+ "Pour afficher la fenetre")
;Créé un thread tournant en arrière plan de l'application
;Afficher ou cacher l'application externe
CreateThread(@ExeShowHide(), #Null)
;Cherche l'application externe en se servant du titre de l'application (Exemple pour la calculatrice)
ExeHwnd = FindWindow_(0,"Calculatrice")
;Enlever de la barre des taches l'icone de l'application externe.
HideFromTaskbar(ExeHwnd, #True)
;Au premier lancement de ce code, l'application externe est affichée
ExeStatus = #True
EndProcedure
Start()
Repeat
Select WaitWindowEvent()
Case #PB_Event_Menu
Select EventMenu()
Case 0 ;
ShowWindow_(ExeHwnd, 1)
Case 1
;Afficher de nouveau dans la barre des taches l'icone de l'application externe.
HideFromTaskbar(ExeHwnd, #False)
;et fin du programme
End
EndSelect
Case #PB_Event_SysTray
;Affichage de l'application externe
If EventType() = #PB_EventType_LeftDoubleClick
ShowWindow_(ExeHwnd, 1)
EndIf
;Affichage du menu contectuel
If EventType() = #PB_EventType_RightClick
DisplayPopupMenu(#MenuPopUp, WindowID(#Mainform))
EndIf
EndSelect
ForEver