> Théorie
PrograZine issue #10 - http://www.citeweb.net/discase/10/systray.htm Edito Sommaire Contribution Contacts


Utilisation du Systray sous Win95/98
par Plouf - plouf@win.be http://www.citeweb.net/pmplayer
Initié Win9x Delphi

    Références et codes exemples dans BMPSKIN.DPR de PMP1.7

    Une fois n'est pas coutume, ce tut va être court, car tous les détails de programations relatifs à la programmation multitâche sous Win sont discutés dans un autre turoriel.

    Le systray, c'est cet espèce de pseudo barre de tâche se trouvant à droite de la vraie bare des tâches, donc les petites icônes qui se trouvent juste à gauche de l'heure. Ce texte va vous apprendre à en placer et à faire réagir votre programme en fonction de ce qui lui arrive : déplacement de la souris, clickage, double-clickage, etc...

    Vous allez avoir besoin d'une et une seule Api, se trouvant dans shell32.dll, du doux nom de Shell_NotifyIcon (et comme nous utilisons sa version Ascii, Shell_NotifyIconA)

    Nous aurons besoin d'une petite structure et de quelques constantes, les voici en vrac, on continue après :
Type
  TNid=Record
    cbSize:LongWord;
    hWnd:Hwnd;
    uID:LongWord;
    uFlags:LongWord;
    uCallbackMessage:LongWord;
    Icon:HIcon;
    Tip:Array[1..64] Of Char;
  End;
  PNid=^TNid;
Const Nim_Add=0;
      Nim_Delete=2;
      Nim_Modify=1;
      Nif_Icon=2;
      Nif_Message=1;
      Nif_Tip=4;
Var Nid:TNid;
Function Shell_NotifyIcon(Id:LongWord;Nid:PNid):Boolean;StdCall
External 'shell32.dll' Name 'Shell_NotifyIconA';
l

    Trois actions sont envisageables avec cette api, trois actions reprises par les trois constantes Nim_, donc add, delete et modify. Cet ordre s'envoie dans le paramètre Id de l'Api, Nid étant un pointer vers une variable de type TNid, qui contient les détails de nos instructions.
  • >Nid.cbSize contient la taille de la structure TNid=SizeOf(TNid)
  • Nid.hWnd est le handle de la fenêtre responsable de la maintenance de cette icône dans le systray : Form1.Handle par exemple
  • Nid.uID est un "nom" que vous donnez à votre icône dans le systray, pour pouvoir la modifier et la supprimer, vous devrez redonner le même nom que vous avez entré à la création.
  • Nid.uFlags vous permet de définir ce que vous envoyez réelement comme information. Par exemple, vous voulez peut-être ne modifier que le titre et non pas l'icône, vous ne mettrez que Nif_Tip et pas les autres. Ce sont des flags, donc des valeurs qui se OR : si vous voulez tout modifier, entrez Nif_Icon OR Nif_Message OR Nif_Tip. En fonction de ces flags, l'api regardera ou non certains des paramètres suivants :
  • Nid.uCallbackMessage est le message que le systray enverra à la fenêtre qui se charge de la gestion de l'icône en cas d'évènement sur celui-ci. Vous pouvez lui dire d'envoyer le message que vous voulez, mais pour être sur de ne pas lui envoyer de messages qui sont utilisés pour autre chose, vous pouvez lui donner la constante WM_USER. Il s'agit d'un Nonqueued message, et pour le gérer, patchez la fonction windows de votre fenêtre. Le paramètre de ce message est envoyé dans lParam et sont les mêmes que les évenements souris : WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK (remplacez le L par R ou M pour les autres boutons), WM_MOUSEMOVE, il y en a encore d'autres mes ceux-là devraient suffire.
  • Nid.Icon est le handle de l'icône à afficher, par exemple Nid.Icon:=Form1.Icon.Handle
  • Nid.Tip est une suite de 64 octets contenant le message à afficher (en jaune) quand la souris reste dessus immobile pendant un laps de temps.

    Bon, ça devrait suffire je trouve, mais si vous ne vous en sortez pas, n'hésitez surtout pas à me mailer.
Cet article est la propriété de Plouf. La copie et la diffusion sont libres sauf dans un but lucratif sans accord explicite de l'auteur.