"iconiser" un programe dans le systray

Codes specifiques à Windows
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

"iconiser" un programe dans le systray

Message par NY152 »

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 :)
.:NY152:.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: "iconiser" un programe dans le systray

Message par nico »

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.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: "iconiser" un programe dans le systray

Message par falsam »

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
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%
Répondre