[Résolu] systray : icone de l'appli par defaut

Programmation d'applications complexes
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

[Résolu] systray : icone de l'appli par defaut

Message par Dionyzos »

Bonjour,

Je voudrais savoir s'il est possible d'utiliser l'icone de l'application elle même par defaut plutot que de charger un ficheir image tiers dans le systray?

Pour n'avoir qu'un seul executable au final.

Ou peut-etre est-il possible d'integrer un fichier image dans l'exe comme pour une ressource.

Je sais pô comment faire dans les deux cas :(

Help please :cry:

Dionyzos
Dernière modification par Dionyzos le mer. 12/mai/2004 13:16, modifié 1 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Pour ta première question, oui, normalement, tu peux utiliser l'icône du programme dans le systray. (C'est d'ailleurs ce que je fais à chaque fois)

Chris :)
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Message par Dionyzos »

heu...merci de ta réponse rapide, mais comment fait-on ? :)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Tu vas trop vite, j'étais parti récupérer un bout de code :lol:

Code : Tout sélectionner

;- Constantes fenêtres
Enumeration
  #Win_Main
EndEnumeration

;-Constantes diverses
Enumeration
  #SysIcon
  #Sytray
  #PopUp
EndEnumeration

;- Variables globales
Global ScreenWidth, ScreenHeight, CurPos.POINT

;- Récupération des paramètres de l'écran
; Cette partie récupère les coordonnées de la zone de travail de l'écran, 
; c'est à dire la largeur, et la hauteur sans la barre de tâches
;
SystemParametersInfo_(#SPI_GETWORKAREA,0,rect.RECT,0)
ScreenWidth = rect\right        ; Largeur de l'écran
ScreenHeight = rect\bottom      ; Hauteur de l'écran (Zone de travail)

;- Procedures 

;- Ouverture de la fenêtre Principale
Procedure Open_Win_Main(ScrWidth.l, ScrHeight.l, WinWidth, WinHeight)
  WinRect.RECT
  
  If OpenWindow(#Win_Main, ScrWidth - WinWidth, ScrHeight-WinHeight, WinWidth, WinHeight,  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_Invisible , "SysTray-Test")
    hwnd = WindowID(#Win_Main)
    
    ; Après avoir ouvert la fenêtre, on récupère ses dimensions réelles, c'est à dire
    ; celles qui incluent la barre de titre et les bordures 
    GetWindowRect_(hwnd, @WinRect)
    W_Width = WinRect\right - WinRect\left    ; Calcul de la largeur
    W_Height = WinRect\bottom - WinRect\top   ; Calcul de la hauteur
    
    ; On déplace ensuite la fenêtre pour qu'elle colle au coin bas/droite de l'écran
    MoveWindow_(hwnd,ScrWidth-W_Width,ScrHeight-W_Height,W_Width,W_Height,#True)
    
    ProcedureReturn hwnd
  EndIf
EndProcedure

;/ Fermeture/Ouverture de la fenêtre des options
Procedure Minimize(Flag.b)
  If Flag = 1
    DisableMenuItem(1,1)          ; Désactive le menu 1
    DisableMenuItem(2,0)          ; Active le menu 2
    HideWindow(#Win_Main, 1)      ; Réduit la fenêtre
  Else
    DisableMenuItem(1,0)          ; Active le menu 1
    DisableMenuItem(2,1)          ; Désactive le menu 2
    HideWindow(#Win_Main, 0)      ; Affiche la fenêtre
  EndIf
EndProcedure

;- Ouverture de la fenêtre, et création des menus et du SysTray
hwnd = Open_Win_Main(ScreenWidth, ScreenHeight, 200, 150)   ; Ouvre la fenêtre
hIconSysTray = LoadImage(#SysIcon,"ClearScreen.ico")        ; Charge l'icône
AddSysTrayIcon(#Sytray,hwnd,hIconSysTray)                   ; Ajoute l'icône dans le SysTray
CreatePopupMenu(#PopUp)                                     ; Crée un menu Pop-Up
MenuItem(1,"Mettre en icône...")                            ; Ajout des menus
MenuItem(2,"Afficher...")
MenuBar()
MenuItem(3,"Quitter")

; Comme la fenêtre sera invisible à l'ouverture, le menu servant
; à la minimiser sera inactif, tandis que celui servant à l'agrandir
; sera actif
; 
DisableMenuItem(1,1)                         ; Menu inactif à l'ouverture
DisableMenuItem(2,0)                         ; Menu actif à l'ouverture
  
;- Début de la boucle
Repeat
  
  Select WaitWindowEvent()
    Case #PB_Event_SysTray
      Select EventType()
        Case #PB_EventType_RightClick         ; Un click droit fait apparaître le menu          
          DisplayPopupMenu(#PopUp, hwnd)
      EndSelect
      
    Case #PB_EventMenu
      Select EventMenuID()
        
        Case 1 : Minimize(1)                 
        Case 2 : Minimize(0)                  
          
        Case 3 : quit = 1                     
      EndSelect
      
    Case #PB_EventGadget
      Select EventGadgetID()
      EndSelect
    Case #PB_EventCloseWindow : Minimize(1)   
  EndSelect
Until quit = 1
End
Pour le fichier .ico, tu en trouveras certainement un sur ton PC

PS: j'ai pas eu le temps de retirer les bouts de code inutiles :)
Chris :)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

c'est pas bon ta réponse chris

la question etait de recuperer l'icone inclus dans l'exe
pour ensuite, sans avoir à le charger depuis le disque,
l'utiliser pour le systray

ya qq chose dans codearchive je crois je regarde...
Image
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Message par Dionyzos »

Merci Chris, mais en effet ton code ne repond pas à mon attente.
et désolé d'être aussi impatient ;-)

Merci aussi à toi Flype, je vais aussi regarder dans les codes archives...
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Voui!!! :oops:

J'ai zappé un bout du message :cry:

Tant pis, ça servira à d'autres :lol:

Chris :)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

J'ai trouvé un truc, tu mets ce code à la fin de ton fichier source

Code : Tout sélectionner

Icon: 
IncludeBinary "TonFichier.ico" 
IconEnd:
Et celui là au début:

Code : Tout sélectionner

If CreateFile(0, "TonFichier.ico") 
  WriteData(?Icon, ?IconEnd-?Icon)
  CloseFile(0) 
EndIf
Tu n'auras qu'un exe, et l'icone sera extraite au premier lancement.

J'ai pas trouvé autre chose! :(


Chris :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

j'ai plus simple pour récupérer l'icone de l'exe

ce code montre comment récupèrer l'icone de l'exe, tu le trouvras sur Codes-Fr, voir ma signature, dans la rubrique "exécutables"
Dernière modification par Le Soldat Inconnu le sam. 08/mai/2004 18:02, modifié 2 fois.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ben voilà la réponse gràce au code du Soldat Inconnu dans CodeFR
et legerement adapté pour l'occasion :

Code : Tout sélectionner

Procedure.l CatchExeIcon( Flags.l) 
  ExeName.s = Space(255) 
  GetModuleFileName_(0, @ExeName, 255)
  SHGetFileInfo_(ExeName, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | Flags)
  ProcedureReturn InfosFile\hIcon 
EndProcedure 

Procedure.l CatchExeBigIcon()
  ProcedureReturn CatchExeIcon(#SHGFI_LARGEICON)
EndProcedure

Procedure.l CatchExeSmallIcon()
  ProcedureReturn CatchExeIcon(#SHGFI_SMALLICON)
EndProcedure

OpenWindow(0, 0, 0, 200, 100, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Icone de l'exe") 
CreateGadgetList(WindowID()) 

AddSysTrayIcon(0, WindowID(), CatchExeSmallIcon()) 
ButtonImageGadget(0, 5, 5, 90, 90, CatchExeSmallIcon()) 
ButtonImageGadget(1, 105, 5, 90, 90, CatchExeBigIcon()) 
    
Repeat : Until WaitWindowEvent() = #WM_Close
Image
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ca marche pas avec la 3.91

Chris :)
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Message par Dionyzos »

Merci beaucoup les gars, ca marche nikel !!! :D :lol:
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Message par Dionyzos »

J'ai trouvé une autre solution (de Denis) qui marche aussi bien, et qui reprend l'idée de Chris, en utilisant le CatchImage et IncludeBinary :

Là où je veux charger l'icone dans le systray:

Code : Tout sélectionner

AddSysTrayIcon(#SYSTRAY, WindowID(#WIN), CatchImage(#ICON, ?MonIcone))
Et à la fin du fichier je place le bout de code suivant :

Code : Tout sélectionner

DataSection
MonIcone: IncludeBinary "icone.ico"
EndDataSection
Lorsque je compile et créer l'EXE, le fichier icone est inclus dans l'EXE.
Je me retrouve avec un fichier un peu plus gros, mais je n'ai aucun autre fichier à part mon exe 8)

Et voilà 2 solutions pour le prix d'une :D
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

la solution que tu propose est bien connue...
c comme çà qu'on fait quand on sait pas recuperer l'icone de l'exe :wink:
Image
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Même si le problème est résolu, voilà une autre solution.
Le code peut paraître un peu long, mais il n'y a que la procedure GetIcone qui assure l'extraction de l'icone ,(4 lignes).
Le reste ne sert que pour la fenêtre et les menus :wink:

Code : Tout sélectionner

;- Constantes fenêtres
Enumeration
  #Win_Main
EndEnumeration

;-Constantes diverses
Enumeration
  #SysIcon
  #Sytray
  #PopUp
EndEnumeration

;- *********** Extraction de l'icône **************
Procedure GetIcone(WinHandle)
  hInstance = GetWindowLong_(WinHandle,#GWL_HINSTANCE)
  app.s = Space(255)
  GetModuleFileName_(0,@app,255)
  ProcedureReturn ExtractIcon_(hInstance, app, 0)
EndProcedure
;- ************************************************

Procedure Minimize(Flag.b)
  If Flag = 1
    DisableMenuItem(1,1)          ; Désactive le menu 1
    DisableMenuItem(2,0)          ; Active le menu 2
    HideWindow(#Win_Main, 1)      ; Réduit la fenêtre
  Else
    DisableMenuItem(1,0)          ; Active le menu 1
    DisableMenuItem(2,1)          ; Désactive le menu 2
    HideWindow(#Win_Main, 0)      ; Affiche la fenêtre
  EndIf
EndProcedure

;- Ouverture de la fenêtre, et création des menus et du SysTray

hwnd = OpenWindow(#Win_Main, 300, 300, 100, 100,  #PB_Window_SystemMenu | #PB_Window_Invisible , "SysTray-Test")

;- ******* Récupération de l'icone, et affichage ******
hIconSysTray = GetIcone(hwnd)
AddSysTrayIcon(#Sytray,hwnd,hIconSysTray)                   ; Ajoute l'icône dans le SysTray
;- ****************************************************

CreatePopupMenu(#PopUp)                                     ; Crée un menu Pop-Up
MenuItem(1,"Mettre en icône...")                            ; Ajout des menus
MenuItem(2,"Afficher...")
MenuBar()
MenuItem(3,"Quitter")

DisableMenuItem(1,1)                         ; Menu inactif à l'ouverture
DisableMenuItem(2,0)                         ; Menu actif à l'ouverture
 
;- Début de la boucle
Repeat
  
  Select WaitWindowEvent()
    Case #PB_Event_SysTray
      Select EventType()
        Case #PB_EventType_RightClick         ; Un click droit fait apparaître le menu          
          DisplayPopupMenu(#PopUp, hwnd)
      EndSelect
      
    Case #PB_EventMenu
      Select EventMenuID()
        
        Case 1 : Minimize(1)                 
        Case 2 : Minimize(0)                  
          
        Case 3 : quit = 1 : End
      EndSelect
      
    Case #PB_EventGadget
      Select EventGadgetID()
      EndSelect
    Case #PB_EventCloseWindow : Minimize(1)   
  EndSelect
Until quit = 1
End
Chris :)
Répondre