Gestion de sa trayIcone

cs_Michel34 Messages postés 79 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 27 juin 2011 - 15 juin 2009 à 11:14
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 15 juin 2009 à 15:01
Salut a toutes et tous , voila en premier je met le code et ensuite je vous donne mon soucis.

UNIT UMain;


INTERFACE


USES
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  jpeg,
  ExtCtrls,
  StdCtrls,
  ShellApi,
  ComCtrls,
  Menus;
CONST
  TrayPenduleMessage = WM_USER + 100;
TYPE
  TFMain = CLASS(TForm)
    Popup: TPopupMenu;
    Positionner1: TMenuItem;
    SupportICO: TImage;
    Image1: TImage;
    PROCEDURE Positionner1Click(Sender: TObject);
    PROCEDURE FormActivate(Sender: TObject);
    PROCEDURE FormClose(Sender: TObject; VAR Action: TCloseAction);
  PRIVATE
    { Déclarations privées }
        // structure contenant les données pour l'icone
    PenduleData: TNotifyIconData;
    // gestion des messages (clics souris) venant de l'icone
    PROCEDURE WMTrayIconMessage(VAR Msg: TMessage); MESSAGE TrayPenduleMessage;
  PUBLIC
    { Déclarations publiques }
    CO: TColor;
    // Pour mettre son message personnel au passage de la souris sur le trayicone
    PROCEDURE MessagePerso(Msg: STRING);
    // pour choisir librement l'icone de son choix
    PROCEDURE ChoixIcone(I: Integer);
    // Afficher ou supprimer L'icone .
    PROCEDURE AfficherIcone;
    PROCEDURE SupprimeIcone;
    // Execution de l'affichage de la TrayIcone
    PROCEDURE Execute;
  END;


VAR
  FMain   : TFMain;
  // pour la gestion du double-clic sur l'icone
  AutoriseDblClick: Boolean;
  // Chemin des Icones
  VCheminIco: STRING;
IMPLEMENTATION


{$R *.dfm}


PROCEDURE TFMain.WMTrayIconMessage(VAR Msg: TMessage);
VAR
  P       : TPoint;
BEGIN
  CASE Msg.LParam OF


    WM_LBUTTONDBLCLK: ;
    WM_LBUTTONUP:
      IF (AutoriseDblClick) THEN
        BEGIN
          // On remet a False
          AutoriseDblClick := False;
          //-------------------------------------------------------------//


          //  Mettre votre code ICI  //


          //-------------------------------------------------------------//
          Showmessage('Double Click sur l''horloge de la TRAY');
        END;
    WM_RBUTTONUP:
      BEGIN
        // récupère position du curseur pour afficher la fenetre popUp
        GetCursorPos(P);
        // ramène au premier plan pour accèder au menu
        SetForegroundWindow(Handle);
        // ouvre le popup menu à cette position
        PopUp.Popup(P.x, P.y);
      END;
  END;
END;


PROCEDURE TFMain.AfficherIcone;
BEGIN
  WITH PenduleData DO
    BEGIN
      // structure de type TNotifyIconData (voir shellapi.pas)
      // Icone du projet  ou alors l'icone de son choix
        // hIcon := LoadIcon(HInstance, 'MAINICON');
        // = Icone du Programme
      SupportICO.Picture.LoadFromFile(VCheminIco + 'Ico1.ICO');
      hIcon := SupportICO.Picture.Icon.Handle; // Icone de son Choix
      // taille de la structure
      cbSize := SizeOf(PenduleData);
      // handle de l'icone
      Wnd := Handle;
      // n° identifiant l'icone
      uID := 0;
      // texte bulle info = Ici le titre de l'application
      // StrPCopy(szTip, Application.Title);
      //  Ou alors le titre de votre choix
      StrPCopy(szTip, 'Horloge personnelle');
      // message de l'icone vers le Form
      uCallBackMessage := TrayPenduleMessage;
      // champs utilisés
      uFlags := NIF_ICON OR NIF_TIP OR NIF_MESSAGE;
    END;
  // ajout de l'icone (utilise ShellApi)
  Shell_NotifyIcon(NIM_ADD, @PenduleData);
END;


PROCEDURE TFMain.SupprimeIcone;
BEGIN
  // l'ID de l'icone est suffisant pour l'identifier
  PenduleData.uID := 0;
  // On fait une suppression de cette icone
  Shell_NotifyIcon(NIM_DELETE, @PenduleData);
END;


PROCEDURE TFMain.MessagePerso(Msg: STRING);
BEGIN
  SupprimeIcone;
  StrPCopy(PenduleData.szTip, Msg);
  Shell_NotifyIcon(NIM_ADD, @PenduleData);
END;


PROCEDURE TFMain.ChoixIcone(I: Integer);
BEGIN
  SupprimeIcone;
  CASE I OF
    1: SupportICO.Picture.LoadFromFile(VCheminIco + 'Ico1.ICO');
    2: SupportICO.Picture.LoadFromFile(VCheminIco + 'Ico2.ICO');
  END;
  // On affiche la nouvelle
  PenduleData.hIcon := SupportICO.Picture.Icon.Handle;
  Shell_NotifyIcon(NIM_ADD, @PenduleData);
END;


PROCEDURE TFMain.Execute;
BEGIN
  // le Double Click est Autorise
  AutoriseDblClick := true;
  // On affiche l'icone dans la Systray
  AfficherIcone;
END;


PROCEDURE TFMain.Positionner1Click(Sender: TObject);
BEGIN
  CASE popUp.Items[0].Tag OF
    0:
      BEGIN
        popUp.Items[0].Caption := 'Positionner';
        popUp.Items[0].Tag := 1;
        BorderStyle := BsNone;
      END;
    1:
      BEGIN
        popUp.Items[0].Caption := 'None';
        popUp.Items[0].Tag := 0;
        BorderStyle := BsSizeable;
      END;
  END;
END;


PROCEDURE TFMain.FormActivate(Sender: TObject);
BEGIN
  // retire l'icône de la barre des tâches
  ShowWindow(Application.Handle, SW_Hide);
  VCheminIco := ExtractFilePath(Application.ExeName);
  Execute;
END;


PROCEDURE TFMain.FormClose(Sender: TObject; VAR Action: TCloseAction);
BEGIN
  SupprimeIcone;
END;


END.

Voila mon souci , quand je fait un click droit sur la trayIcone , j'ai bien ma popup qui s'affiche je click ,la procedure s'effectue et ensuite la trayIcone disparait , ou j'ai fait un oubli dans mon code.
merci d'avance our votre participation a faire avancer le Scmilblik .
 

A+ Michel

2 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
15 juin 2009 à 14:08
Salut,

pourquoi ne pas créer une unité pour le TrayIcon ?
ça serait beaucoup plus simple à débugger et surtout réutilisable

ensuite dans ton code tu ne fais que NIM_ADD où NIM_DELETE
alors que pour modifier quelque chose il faudrait utiliser "NIM_MODIFY" !!

c'est peut être ça le problème

 
@+
Cirec

<hr siz="" />
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
15 juin 2009 à 15:01
sinon ya des compos simples qui font deja tout ça . . .
0
Rejoignez-nous