IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

[D6][Windows 11 64 bits] Effacer application gestionnaire de tâches si erreur explorer


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut [D6][Windows 11 64 bits] Effacer application gestionnaire de tâches si erreur explorer
    Bonjour à toutes et à tous,

    Je me demandais si il était possible d'effacer une application du gestionnaire de tâches quand il existe une erreur du système afin de pouvoir la relancer.

    J'avais essayé avec un Killprocess dans le destroy de la fiche mais cela ne fonctionne pas en cas d'erreur de l'exploreur de Windows, ce même code derrière un "Tbutton" fonctionne.

    Merci d'avance.

    @+,

    cincap

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour Cincap,
    de quelle erreur système parles tu ? Une erreur dans ton application ? si oui, avec des try Except, tu dois pouvoir libérer les ressources et la fermer toi même ?

    Mais bien sûr il faut savoir ou l'erreur ou les erreurs peuvent se produire.

    A+
    Charly

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    @ Charly910, merci de ton message.

    de quelle erreur système parles tu ? Une erreur dans ton application ? si oui, avec des try Except, tu dois pouvoir libérer les ressources et la fermer toi même ?
    Non l'erreur qui n'en est pas une c'est quand Windows 11 ajoute une mise à jour et que l'on ne doit pas relancer le PC.

    C'est à ce moment que j'ai constaté que mon application dans la TrayIcon n'était plus visible mais toujours dans le gestionnaire de tâches donc je ne sais pas la relancer grâce à un mutex.

    Je vérifie aussi.

    @+,

    cincap

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour Cincap,
    tu pourrais faire une autre application qui ferme ton appli et qui la relance. Tu places le raccourci sur le bureau, ce qui te permet de la relancer immédiatement si l’icône disparait dans le Systray

    A+
    Charly

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    ah ben voilà, quand on a les bonnes infos on peut donner les bonnes réponses.

    Ton problème c'est qu'après un crash d'Explorer les traits icones ne sont plus là...il faut donc détecter le crash de Explorer pour réinstaller l'icone; pas besoin de relancer l'appli.

    et là on trouve la réponse
    http://www.delphigroups.info/2/66/477545.html

    il suffit de se mettre à l'écoute du message 'TaskbarCreated'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    type
      Tform1 = class(TForm)
      ...
       procedure FormCreate(Sender: TObject);
       ..
        msgTaskbarRestart: Integer;
        procedure WndProc(var Message: TMessage); override;
      end;
    ...
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      msgTaskbarRestart := RegisterWindowMessage(PChar('TaskbarCreated'));
    end;
     
    procedure TForm1.WndProc(var MEssage: TMessage);
    begin
        if (msgTaskbarRestart <> 0) and (Message.Msg = msgTaskbarRestart)
        then  begin
                  SysTray.Active := False;
                  Application.ProcessMessages;  {not sure why I needed this}
                  SysTray.Active := True;    
                  Message.Result := 1;
              end;
        inherited;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    @ Charly910,

    tu pourrais faire une autre application qui ferme ton appli et qui la relance. Tu places le raccourci sur le bureau, ce qui te permet de la relancer immédiatement si l’icône disparait dans le Systray
    Dans mes tests c'est déjà fait mais je trouvais cela pas pratique.

    @ Paul THOT, c'est exactement cela, petite question je peus mettre ce code directement dans le logiciel concerné ou une autre application qui ne sert qu'a cela ?

    Merci pour la suggestion.

    @+,

    cincap

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    ben si tu veux que ce soit automatique, il faut le mettre directement dans l'appli...sinon ça revient à savoir comment lancer une appli quand l'Explorer se plante ?!
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    @ Paul TOTH, je n'arrive pas à intégrer ce code dans mon application est ce que c'est à cause de D6 et Windows 11 ?

    Ou je place mal ce code ?

    Merci,

    @+,

    cincap

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    ou alors un problème de clavier ? non je plaisante, mais ça veux dire quoi "je n'arrive pas à intégrer ce code" ?

    j'ai vu ici que si ton appli s'execute en tant qu'admin elle ne recevra pas le message sauf à appeler ChangeWindowMessageFilter
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    @ Paul TOTH, en fait c'est au niveau de systray (identificateur non déclaré !).

    Mon application est simple pourtant et presque pas de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    const WM_ICONTRAY = WM_USER+1;
     
    type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        Formshow1: TMenuItem;
        Formhide1: TMenuItem;
        Exit1: TMenuItem;
        procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Formshow1Click(Sender: TObject);
        procedure Formhide1Click(Sender: TObject);
        procedure Exit1Click(Sender: TObject);
        procedure FormActivate(Sender: TObject);
      private
        { Déclarations privées }
      TrayIconData, nid: TNotifyIconData;
      msgTaskbarRestart: Integer;
        procedure WndProc(var Message: TMessage); override;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      MustExit:boolean;
     
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     
     MustExit:=false;
      TrayIconData.cbSize:=SizeOf(TrayIconData);
      TrayIconData.Wnd:=Handle;
      TrayIconData.uID:=0;
      TrayIconData.uFlags:=NIF_MESSAGE + NIF_ICON + NIF_TIP;
      TrayIconData.uCallbackMessage:=WM_ICONTRAY;
      TrayIconData.hIcon:=Application.Icon.Handle;
      StrPCopy(TrayIconData.szTip,Application.Title);
      Shell_NotifyIcon(NIM_ADD, @TrayIconData);
      msgTaskbarRestart := RegisterWindowMessage(PChar('TaskbarCreated'));
    end;
     
    procedure TForm1.WndProc(var MEssage: TMessage);
    begin
        if (msgTaskbarRestart <> 0) and (Message.Msg = msgTaskbarRestart)
        then  begin
                  SysTray.Active := False;
                  Application.ProcessMessages;  {not sure why I needed this}
                  SysTray.Active := True;
                  Message.Result := 1;
              end;
        inherited;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
    end;
     
    procedure TForm1.TrayMessage(var Msg: TMessage);
    var p:TPoint;
    begin
      case Msg.lParam of
        WM_LBUTTONDOWN: begin
                         Form1.show;
                         Application.Restore;
                        end;
        WM_RBUTTONDOWN: begin
                         GetCursorPos(p);
                         PopUpMenu1.Popup(p.x,p.y);
                        end;
      end;
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    if MustExit then exit;
     Form1.Hide;
     Action:=caNone;
    end;
     
    procedure TForm1.Formshow1Click(Sender: TObject);
    begin
     Form1.Show;
    end;
     
    procedure TForm1.Formhide1Click(Sender: TObject);
    begin
    Form1.Hide;
    end;
     
    procedure TForm1.Exit1Click(Sender: TObject);
    begin
    MustExit:=true;
     Close;
    end;
     
    procedure TForm1.FormActivate(Sender: TObject);
    var
     DesktopRect: TRect;
    begin
      SystemParametersInfo(SPI_GETWORKAREA, 0, @DesktopRect, 0);
      with DesktopRect do
        Caption := Format('%d x %d', [Right, Bottom]);
    end;
     
    end.
    @+,

    cincap

  11. #11
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    SysTray dans le code c'est juste le composant SysTray des Delphi récents...dans ton cas il faut remplacer par le code qui affiche l'icon dans le Systray

    sans avoir testé, ça devrait donner quelque chose comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    const WM_ICONTRAY = WM_USER+1;
     
    type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        Formshow1: TMenuItem;
        Formhide1: TMenuItem;
        Exit1: TMenuItem;
        procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Formshow1Click(Sender: TObject);
        procedure Formhide1Click(Sender: TObject);
        procedure Exit1Click(Sender: TObject);
        procedure FormActivate(Sender: TObject);
      private
        { Déclarations privées }
      TrayIconData, nid: TNotifyIconData;
      msgTaskbarRestart: Integer;
        procedure AddSysTray;
        procedure WndProc(var Message: TMessage); override;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      MustExit:boolean;
     
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin 
     MustExit:=false;
      msgTaskbarRestart := RegisterWindowMessage(PChar('TaskbarCreated'));
      AddSysTray;
    end;
     
    procedure Tform1.AddSysTray;
    begin
      TrayIconData.cbSize:=SizeOf(TrayIconData);
      TrayIconData.Wnd:=Handle;
      TrayIconData.uID:=0;
      TrayIconData.uFlags:=NIF_MESSAGE + NIF_ICON + NIF_TIP;
      TrayIconData.uCallbackMessage:=WM_ICONTRAY;
      TrayIconData.hIcon:=Application.Icon.Handle;
      StrPCopy(TrayIconData.szTip,Application.Title);
      Shell_NotifyIcon(NIM_ADD, @TrayIconData);
    end;
     
    procedure TForm1.WndProc(var MEssage: TMessage);
    begin
        if (msgTaskbarRestart <> 0) and (Message.Msg = msgTaskbarRestart)
        then  begin
                  AddSysTray;
                  Message.Result := 1;
              end;
        inherited;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
    end;
     
    procedure TForm1.TrayMessage(var Msg: TMessage);
    var p:TPoint;
    begin
      case Msg.lParam of
        WM_LBUTTONDOWN: begin
                         Form1.show;
                         Application.Restore;
                        end;
        WM_RBUTTONDOWN: begin
                         GetCursorPos(p);
                         PopUpMenu1.Popup(p.x,p.y);
                        end;
      end;
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    if MustExit then exit;
     Form1.Hide;
     Action:=caNone;
    end;
     
    procedure TForm1.Formshow1Click(Sender: TObject);
    begin
     Form1.Show;
    end;
     
    procedure TForm1.Formhide1Click(Sender: TObject);
    begin
    Form1.Hide;
    end;
     
    procedure TForm1.Exit1Click(Sender: TObject);
    begin
    MustExit:=true;
     Close;
    end;
     
    procedure TForm1.FormActivate(Sender: TObject);
    var
     DesktopRect: TRect;
    begin
      SystemParametersInfo(SPI_GETWORKAREA, 0, @DesktopRect, 0);
      with DesktopRect do
        Caption := Format('%d x %d', [Right, Bottom]);
    end;
     
    end.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    @ Paul TOTH, merci pour la modification, concernant mon application de test cela fonctionne correctement.

    Comme j'ai 3 logiciels qui se placent dans la TrayIcon, je vais les adapter et je vous tiendrai au courant.

    Je ferme le topic.

    Encore un grand merci à Paul TOTH.

    @+,

    cincap

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    @ Paul TOTH, cela fonctionne sauf une application sur les trois qui charge une dll pour le Hook du calendrier sur le bureau.

    https://codes-sources.commentcamarch...r-votre-bureau

    Après la remise de l'icône dans la TrayIcon, le Hook ne fonctionne plus, je dois le Killer puis redémarrer.

    Ce n'est pas un problème en soi.

    @+,

    cincap

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    @ Paul TOTH, Tout est ok, j'ai simplement rajouter une ligne de code dans la procédure WndProc pour réactiver le Hook dès la réception du message.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (msgTaskbarRestart <> 0) and (Message.Msg = msgTaskbarRestart)
        then  begin
                  AjouteSysTrayIcone;
                  Message.Result := 1;       
             If Assigned(HookSourisActif) Then HookSourisActif;
              end;
        inherited;
    Encore un grand merci à ceux qui ont participé à ce topic.

    @+,

    cincap

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. une version d'application delphi compatible avec windows 7 32 bit
    Par yandi dans le forum SIG : Système d'information Géographique
    Réponses: 1
    Dernier message: 07/12/2021, 15h07
  2. Réponses: 2
    Dernier message: 26/12/2017, 12h13
  3. Réponses: 7
    Dernier message: 21/07/2014, 10h35
  4. Réponses: 7
    Dernier message: 08/07/2014, 16h02
  5. windows XP 64 bits et application 16 bits
    Par JeanMarc_T2k dans le forum Windows XP
    Réponses: 2
    Dernier message: 21/11/2005, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo