Installer un programme résident en Trayicon ce n'est pas compliqué quand on sait. Être sûr qu'il n'empêchera pas Windows de se fermer c'est une autre histoire. Elle m'est arrivée. Aussi j'ai écrit un programme complet qui peut servir de base a ceux qui comme moi n'aime pas faire chauffer les neurones.
Source / Exemple :
// L'élément de base du programme tient dans les deux fonctions
// WM_QueryEndSession et WM_EndSession.
// Bien sûr il faut les replacer dans le contexte du programme.
// Aussi le plus simple est de charger le zip qui contient tous les fichiers
// tester sous delphi5 mais qui n'utilise aucun objet extérieur à Delphi
// Un exe est compris dans le zip pour tester le programme.
unit uPrg;
interface
uses
Windows,
ShellAPI,
Messages,
SysUtils,
Classes,
Controls,
Forms,
StdCtrls,
Menus,
Buttons,
Dialogs;
const
// dcResid © D.C V1.0.0.0
Titre = '%s © D.C V%s';
Wm_CallBackMessage = wm_user + 1;
ProgName = 'dcResid';
ICONON = 1;
ICONOFF = 2;
type
TfrmPrg = class(TForm)
PopMenu: TPopupMenu;
popAbout: TMenuItem;
popOuvrir: TMenuItem;
popExit: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
Label1: TLabel;
sbApropos: TSpeedButton;
Label2: TLabel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure popAboutClick(Sender: TObject);
procedure popOuvrirClick(Sender: TObject);
procedure popExitClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure sbAproposClick(Sender: TObject);
private
{ Déclarations privées }
hIconOn : THandle;
hIconOff : THandle;
nid : TNotifyIconData;
OnlyHide : Boolean;
bOkWnd : Boolean;
procedure WMQueryEndSession(var Msg : TWMQueryEndSession); message WM_QueryEndSession;
procedure WMEndSession(var Msg : TWMEndSession); message WM_EndSession;
procedure WMCallBackMessage(Var msg : TMessage); message WM_CallBackMessage;
public
{ Déclarations publiques }
procedure RefreshTitre;
procedure ChangeIcon(Etat : Boolean);
procedure User (var msg: TMessage); message wm_User;
end;
var
frmPrg: TfrmPrg;
implementation
uses
About,
u_Global;
{$R *.DFM}
procedure TfrmPrg.User(var msg: TMessage);
Begin
Application.Restore;
End;
procedure TfrmPrg.WMQueryEndSession(var Msg : TWMQueryEndSession);
begin
// On signale a Windows qu'on accepte la fermeture des programmes
if MessageDlg('Windows désire se fermer, acceptez-vous ?',
mtConfirmation,
[mbYes,mbNo], 0) = mrNo then
Msg.Result := 0
else
Msg.Result := 1 ;
bOkWnd := (Msg.Result = 1)
end;
procedure TfrmPrg.WMEndSession(var Msg : TWMEndSession);
begin
// maintenant, avec notre accord, il faut libérer
if bOkWnd then popExitClick(Self);
end;
// si c'est un clique droit de la souris, alors on montre le popup menu
procedure ShowPopupMenu(f : TForm; p : TPopupMenu);
var
pt : TPoint;
begin
GetCursorPos(pt);
SetForegroundWindow(f.handle);
p.Popup(pt.x, pt.y);
end;
// Si c'est un double click alors on montre l'application Tray Icon
procedure ShowApplication(f : TForm);
begin
f.visible:=true;
end;
procedure TfrmPrg.WMCallBackMessage(var msg : TMessage);
begin
case msg.lParam of
Wm_RButtonDown : ShowPopupMenu(self, PopMenu);
Wm_LButtonDblClk : ShowApplication(self);
Wm_LButtonDown : ;
Wm_MouseMove : ;
end;
end;
procedure TfrmPrg.popAboutClick(Sender: TObject);
begin
AboutBox.ShowModal;
end;
procedure TfrmPrg.popOuvrirClick(Sender: TObject);
begin
ShowApplication(self);
ChangeIcon(True);
end;
procedure TfrmPrg.popExitClick(Sender: TObject);
begin
// pour décharger le Tray Icon alors on supprime sa référence
// puis on positionne la variable OnlyHide à false pour libérer la
// mémoire associée à la fiche lors de la fermeture de la fiche
Shell_NotifyIcon(NIM_DELETE,@nid);
OnlyHide := False;
Close;
end;
procedure TfrmPrg.FormCreate(Sender: TObject);
begin
// Extraction des icones
hIconOn := ExtractIcon(Handle, 'dcResid.exe',ICONON);
hIconOff := ExtractIcon(Handle, 'dcResid.exe',ICONOFF);
// Lorsqu'on demande de fermer la fenêtre du Tray Icon, celle-ci est
// simplement cachée
OnlyHide := True;
// Lecture des infos programme
ProgrammeInfo;
RefreshTitre;
// on initialise la structure TNotifyIconData
with nid do begin
cbSize:=sizeof(nid); // taille de la structure
wnd:=handle; // fenêtre du Tray Icon
uID:=1;
uCallBackMessage:=wm_CallBackMessage; // message envoyé par le système
hIcon:=hIconOn; // l'îcône du Tray Icon
szTip:=ProgName; // Message d'aide
uFlags:=nif_message or nif_Icon or nif_tip;// Indique que notre Tray Icon
// reçoit un message,
// a une icône et un conseil
end;
// enregistre le Tray Icon
Shell_NotifyIcon(NIM_ADD, @nid);
// cache l'application
ShowWindow(Application.Handle, SW_HIDE);
end;
procedure TfrmPrg.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// Si le tray Icon doit uniquement être caché, alors on cache la fenêtre
// sans libérer sa mémoire
if OnlyHide then
begin
Action := caNone;
Visible := false;
ChangeIcon(False);
end;
end;
procedure TfrmPrg.ChangeIcon(Etat : Boolean);
begin
If Etat then
nid.hIcon := hIconOn
else
nid.hIcon := hIconOff;
Shell_NotifyIcon(NIM_MODIFY, @nid);
end;
procedure TfrmPrg.RefreshTitre;
begin
frmPrg.caption := Format(Titre,[pInfo.InternalName, pInfo.FileVersion]);
end;
procedure TfrmPrg.sbAproposClick(Sender: TObject);
begin
AboutBox.ShowModal;
end;
end.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.