Application Delphi de la barre d'état système

Jetez un œil à votre barre des tâches. Voir la zone où se trouve l'heure? Y a-t-il d'autres icônes là-bas? L'endroit est appelé la barre d'état système de Windows. Souhaitez-vous placer votre Delphes l'icône de l'application là-bas? Souhaitez-vous que cette icône soit animée ou reflète l'état de votre application?

Cela serait utile pour les programmes qui restent en cours d'exécution pendant de longues périodes sans interaction avec l'utilisateur (les tâches d'arrière-plan que vous continuez généralement à exécuter sur votre PC toute la journée).

Ce que vous pouvez faire est de faire en sorte que vos applications Delphi semblent se réduire au plateau (au lieu de Barre des tâches, à droite du bouton Win Start) en plaçant une icône dans la barre d'état et en créant simultanément votre (vos) formulaire (s) invisible.

Tray It

Heureusement, la création d'une application qui s'exécute dans la barre d'état système est assez facile - une seule fonction (API), Shell_NotifyIcon, est nécessaire pour accomplir la tâche.

instagram viewer

La fonction est définie dans le Unité ShellAPI et nécessite deux paramètres. Le premier est un indicateur indiquant si l'icône est ajoutée, modifiée ou supprimée, et le second est un pointeur vers une structure TNotifyIconData contenant les informations sur l'icône. Cela inclut la poignée de l'icône à afficher, le texte à afficher sous forme d'infobulle lorsque la souris survole l'icône, le poignée de la fenêtre qui recevra les messages de l'icône et le type de message que l'icône enverra à ce fenêtre.

Tout d'abord, dans la section privée de votre formulaire principal, mettez la ligne:
TrayIconData: TNotifyIconData;

type
TMainForm = classe(TForm)
procédure FormCreate (expéditeur: TObject);
privé
TrayIconData: TNotifyIconData;
{Déclarations privées}Publique{Déclarations publiques}fin;

Ensuite, dans votre formulaire principal OnCreate, initialisez la structure de données TrayIconData et appelez la fonction Shell_NotifyIcon:

avec TrayIconData dobegin
cbSize: = SizeOf (TrayIconData);
Wnd: = Poignée;
uID: = 0;
uFlags: = NIF_MESSAGE + NIF_ICON + NIF_TIP;
uCallbackMessage: = WM_ICONTRAY;
hIcon: = Application. Icône. Manipuler;
StrPCopy (szTip, Application. Titre);
fin;
Shell_NotifyIcon (NIM_ADD, @TrayIconData);

Le paramètre Wnd de la structure TrayIconData pointe vers la fenêtre qui reçoit les messages de notification associés à une icône.

Le hIcon pointe vers l'icône que nous voulons ajouter au plateau - dans ce cas, l'icône principale Applications est utilisée.
Le szTip contient le texte de l'info-bulle à afficher pour l'icône - dans notre cas, le titre de l'application. Le szTip peut contenir jusqu'à 64 caractères.
Le paramètre uFlags est défini pour indiquer à l'icône de traiter les messages de l'application, d'utiliser l'icône de l'application et son conseil. le uCallbackMessage pointe vers l'identificateur de message défini par l'application. Le système utilise l'identifiant spécifié pour les messages de notification qu'il envoie à la fenêtre identifiée par Wnd chaque fois qu'un événement de souris se produit dans le rectangle englobant de l'icône. Ce paramètre est défini sur la constante WM_ICONTRAY définie dans la section interface de l'unité de formulaires et est égale à: WM_USER + 1;

Vous ajoutez l'icône au plateau en appelant la fonction API Shell_NotifyIcon. Le premier paramètre "NIM_ADD" ajoute une icône à la zone du bac. Les deux autres valeurs possibles, NIM_DELETE et NIM_MODIFY sont utilisées pour supprimer ou modifier une icône dans la barre d'état - nous verrons comment plus loin dans cet article. Le deuxième paramètre que nous envoyons à Shell_NotifyIcon est la structure TrayIconData initialisée.

Prends-en un

Si vous exécutez votre projet maintenant, vous verrez une icône près de l'horloge dans le bac. Notez trois choses.

1) Tout d'abord, rien ne se passe lorsque vous cliquez (ou faites quoi que ce soit d'autre avec la souris) sur l'icône placée dans le bac - nous n'avons pas encore créé de procédure (gestionnaire de messages).
2) Deuxièmement, il y a un bouton sur la barre des tâches (nous ne voulons évidemment pas qu'il y soit).
3) Troisièmement, lorsque vous fermez votre application, l'icône reste dans le bac.

Prendre deux

Résolvons cela à l'envers. Pour que l'icône soit supprimée du bac lorsque vous quittez l'application, vous devez à nouveau appeler Shell_NotifyIcon, mais avec NIM_DELETE comme premier paramètre. Vous faites cela dans OnDestroy gestionnaire d'événements pour le formulaire principal.

procédure TMainForm. FormDestroy (expéditeur: TObject);
commencer
Shell_NotifyIcon (NIM_DELETE, @TrayIconData);
fin;

Pour masquer l'application (bouton de l'application) de la barre des tâches, nous utiliserons une astuce simple. Dans le code source de Projets, ajoutez la ligne suivante: Application. ShowMainForm: = False; avant la demande. CreateForm (TMainForm, MainForm); Par exemple, laissez-le ressembler

...
commencer
Application. Initialiser;
Application. ShowMainForm: = False;
Application. CreateForm (TMainForm, MainForm);
Application. Courir;
fin.

Et enfin, pour que notre icône Tray réponde aux événements de la souris, nous devons créer une procédure de gestion des messages. Tout d'abord, nous déclarons une procédure de gestion des messages dans la partie publique de la déclaration de formulaire: procedure TrayMessage (var Msg: TMessage); message WM_ICONTRAY; Deuxièmement, la définition de cette procédure ressemble à:

procédure TMainForm. TrayMessage (var Msg: TMessage);
casse Msg.lParam de
WM_LBUTTONDOWN:
commencer
ShowMessage ('Clic gauche sur le bouton
- MONTRONS le formulaire! ');
MainForm. Spectacle;
fin;
WM_RBUTTONDOWN:
commencer
ShowMessage ('Clic droit sur le bouton
- CACHONS le formulaire! ');
MainForm. Cacher;
fin;
fin;
fin;

Cette procédure est conçue pour gérer uniquement notre message, le WM_ICONTRAY. Il prend la valeur LParam de la structure du message qui peut nous donner l'état de la souris lors de l'activation de la procédure. Par souci de simplicité, nous ne traiterons que la souris gauche vers le bas (WM_LBUTTONDOWN) et la souris droite vers le bas (WM_RBUTTONDOWN). Lorsque le bouton gauche de la souris est enfoncé sur l'icône, nous montrons le formulaire principal, lorsque le bouton droit est enfoncé, nous le cachons. Bien sûr, il existe d'autres messages d'entrée de souris que vous pouvez gérer dans la procédure, comme le bouton haut, le double-clic sur le bouton, etc.

C'est ça. Rapide et facile. Ensuite, vous verrez comment animer l'icône dans le bac et comment faire en sorte que cette icône reflète l'état de votre application. De plus, vous verrez comment afficher un menu contextuel près de l'icône.