Interception arret windows


Description

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.

Codes Sources

A voir également

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.