Je souhaite réduire une application Delphi au systray au lieu de la barre des tâches.Delphi: Réduire l'application à systray
Les étapes nécessaires semblent être les suivants:
- Créer icône qui devrait alors être affiché dans le systray.
- Lorsque l'utilisateur clique sur le [-] pour réduire l'application, procédez comme suit:
- Masquer la forme.
- Ajoutez l'icône (étape 1) à la barre d'état système.
- Masquer/supprimer l'entrée de l'application dans la barre des tâches.
- Lorsque le utilisateur double-clique sur l'icône de l'application dans le systray, procédez comme suit:
- Afficher le formulaire.
- Désactivez de nouveau l'application et ramenez-la vers l'avant.
- Si "WindowState" est "WS_Minimized" défini sur "WS_Normal".
- Masquer/supprimer l'icône de l'application dans la barre des tâches.
- Lorsque l'utilisateur met fin à l'application, procédez comme suit:
- Cacher/supprimer l'icône de l'application dans le systray.
Voilà. Droite?
Comment pourrait-on implémenter cela dans Delphi?
J'ai trouvé le code suivant mais je ne sais pas pourquoi cela fonctionne. Il ne suit pas mes étapes décrites ci-dessus ...
unit uMinimizeToTray;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellApi;
const WM_NOTIFYICON = WM_USER+333;
type
TMinimizeToTray = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure CMClickIcon(var msg: TMessage); message WM_NOTIFYICON;
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
MinimizeToTray: TMinimizeToTray;
implementation
{$R *.dfm}
procedure TMinimizeToTray.CMClickIcon(var msg: TMessage);
begin
if msg.lparam = WM_LBUTTONDBLCLK then Show;
end;
procedure TMinimizeToTray.FormCreate(Sender: TObject);
VAR tnid: TNotifyIconData;
HMainIcon: HICON;
begin
HMainIcon := LoadIcon(MainInstance, 'MAINICON');
Shell_NotifyIcon(NIM_DELETE, @tnid);
tnid.cbSize := sizeof(TNotifyIconData);
tnid.Wnd := handle;
tnid.uID := 123;
tnid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
tnid.uCallbackMessage := WM_NOTIFYICON;
tnid.hIcon := HMainIcon;
tnid.szTip := 'Tooltip';
Shell_NotifyIcon(NIM_ADD, @tnid);
end;
procedure TMinimizeToTray.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone;
Hide;
end;
end.
Il fut un temps que le TApplication est celui qui a créé l'entrée de la barre des tâches, et les TForms étaient libres d'agir de façon indépendante. Cela a-t-il changé dernièrement? –
Quelle version de Delphi utilisez-vous? Dans les versions plus récentes, il y a un TTrayIcon dans la VCL, que vous pouvez utiliser pour créer l'icône de la barre, au moins. –
Le code est différent avec vos étapes dans cela; - l'icône systray est toujours visible, - elle n'interfère pas avec 'minimiser' (il n'y a pas d'étape 2), quand on clique deux fois sur l'icône, elle montre le formulaire caché en cliquant sur la case de fermeture [X], - ne prend pas fin en compte (il n'y a pas d'étape 4). –