Bonjour,
Pour les besoins d'un programme, je dois faire appel à un autre utilitaire assez encombrant. Etant un transfuge de Visual Basic, dans ce langage j'avais trouvé une classe permettant de mettre ce que l'on voulait dans le systray (tant que le programme était visible). Dans Purebasic je nage complètement pour faire un code analogue.
Si quelqu'un a déjà réussi cette action, je serais aux anges d'en connaitre la méthode.
J'insiste bien sur le fait que ce n'est pas le programme créé qui doit être envoyé dans le systray mais bien un programme externe que l'on indiquerait dans le code (ou détecté via la souris ou le focus, ça reste à définir dans mon projet)
D'avance, merci
"iconiser" un programe dans le systray
"iconiser" un programe dans le systray
.:NY152:.
Re: "iconiser" un programe dans le systray
Tu peux toujours simuler l'action, en gros tu crée un systray dans ton programme, tu récupères l'icône de l'exe et tu t'en sert pour le systray, tu crées un menu afficher réduire mais en fait dans ton programme tu caches où tu montres l'application en question.
C'est simple à faire et je crois que c'est comme ça que font les programmes en question.
C'est simple à faire et je crois que c'est comme ça que font les programmes en question.
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: "iconiser" un programe dans le systray
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.
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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%