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

Langage Delphi Discussion :

effacer les anciens trayicons des mes applis?


Sujet :

Langage Delphi

  1. #1
    Membre confirmé
    Avatar de korntex5
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2004
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 411
    Points : 454
    Points
    454
    Billets dans le blog
    1
    Par défaut effacer les anciens trayicons des mes applis?
    Salut j'ai une applis qui met une icone dans la barre de tâches 'en trayicon' et comme je débugge je plant souvent ou redémarre mon applis, et une nouvelle icone vient se placer dans la barre des tâches non pas à la place de l'ancienne mais en plus de l'ancienne. Et seul le passage du curseur de la souris efface cette ancienne iconne.....

    normal ou habituel me direz vous....

    Je me demande si au démarrage de mon applis je ne pourrais pas rafraichir la barre des tâches pour effacer mes icônes qui s'entassent....
    Que la source soit avec moi!
    Jérôme JEAN-MARAULT

  2. #2
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    hmmm y aurait-il moyen de récupérer un handle sur la barre de tâches ou sur le systray et de lui envoyer un ptit message du genre invalidate ?

    Je te laisse chercher dans cette voie
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  3. #3
    Membre confirmé
    Avatar de korntex5
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2004
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 411
    Points : 454
    Points
    454
    Billets dans le blog
    1
    Par défaut
    voici la solution, je récuperre la liste des icones dans la barres des tâches et j'envoie le message de suppression a celles qui ne devraient plus être la...
    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
     
     
     
    type Tray = record
        hwnd : Cardinal; //handle de la fenêtre
        uID : Integer; //id de l//icone
        uCallbackMessage : Cardinal; //message envoyé à la fenêtre
        Unknown1 : Cardinal; //interprétation inconnue
        Unknown2 : Cardinal; //interprétation inconnue
        hIcon : Cardinal; //handle de l//icone affichée
        Unknown3 : Cardinal; //interprétation inconnue
        Unknown4 : Cardinal; //interprétation inconnue
        Unknown5 : Cardinal; //interprétation inconnue
        uniPath: string; //chemin et nom du fichier du processus qui a cette icone dans le tray
        sTip: string; //ToolTip de l//icone
        iBitmap : Cardinal; //index de l//icone affichée
        idCommand : Integer; //id de la commande
        fsState: byte; //état de l//icone
        fsStyle: byte; //style de l//icone (TBSTYLE_BUTTON)
        dwData : Cardinal; //pointeur vers les données du tray
        iString : Cardinal; //pointeur vers le Tip
    end;
     
     
     
     
     
     
     
    procedure TFrmMain.NettoieBarreDesTaches;
    var
       hProc : Cardinal; //handle de Explorer.exe
       hTray : Cardinal; //hWnd du tray
       pid : Cardinal; //identifiant de Explorer.exe
       ptrVM : Pointer; //pointeur vers la zone mémoire pour TBBUTTON
       ret : Cardinal; //valeur de retour
       tbut: _TBBUTTON; //les infos sur le bouton
       x : Cardinal; //compteur
       nIcons : Cardinal; //nombre d//icones dans le tray
       Icons: array of Tray; //tableau temporaire des icones dans le tray
       Icon:TNotifyIconData;
     
    const
       PROCESS_VM = PROCESS_QUERY_INFORMATION Or PROCESS_VM_OPERATION
                 Or PROCESS_VM_READ Or PROCESS_VM_WRITE; //Or PROCESS_DUP_HANDLE
     
     
       //renvoie le Hwnd du tray
        function GethWndTray() : Cardinal;
        var
        hwnd,hwnd2 : Cardinal; //handle
        begin
          //on descend dans la hiérarchie parent-enfant
          hwnd := FindWindow('Shell_TrayWnd', 0);
          hwnd := FindWindowEx(hwnd, 0, 'TrayNotifyWnd', 0);
          hwnd2 := FindWindowEx(hwnd, 0, 'SysPager', 0); //uniquement XP
          If (hwnd2 = 0) Then
            hwnd2 := hwnd; // ME,2000
     
          //jusqu//à obtenir le handle de la barre d//outils faisant de tray
          hwnd2 := FindWindowEx(hwnd2, 0, 'ToolbarWindow32', 0); // ME, 2000, XP...
          If (hwnd2 = 0) Then
              Result := hwnd // 95,98
          Else
              Result := hwnd2;  // ME, 2000, XP...
        end;
     
     
    begin
      hTray := GethWndTray(); //on demande le hWnd du tray
      If hTray = 0 Then //si erreur
        Exit;
      GetWindowThreadProcessId(hTray, @pid); //on demande l'identifiant de Explorer.exe
      hProc := OpenProcess(PROCESS_VM, False, pid) ; //on demande un handle de Explorer.exe
      If hProc = -1 Then  //si erreur
        Exit;
      ptrVM := VirtualAllocEx(hProc, nil, sizeof(tbut), MEM_COMMIT, PAGE_READWRITE);//on alloue de la mémoire pour TBBUTTON
      If ptrVM = nil Then //si erreur
        Exit;
      nIcons := SendMessage(hTray, TB_BUTTONCOUNT, 0, 0); //on demande le nombre de boutons dans le tray
      SetLength(Icons,nIcons);//on redimensionne le tableau au nombre d'icones
     
      For x := 0 To nIcons - 1 do //on parcours la liste des icones
      begin
          SendMessage(hTray, TB_GETBUTTON, wparam(x), lparam(ptrVM));//on demande les infos sur le bouton
          ReadProcessMemory(hProc, ptrVM, @tbut, sizeof(tbut), ret);//on lit les infos sur le bouton
          ReadProcessMemory(hProc, Pointer(tbut.dwData), @Icons[x].hwnd, 36, ret); //on lit les données de l'icone
     
          //on envoie la commande de suppression de l'icone qui ne fonctionne
          //que si cette icone n'est plus attachée a un programme
          Icon.cbSize := 0;            //SizeOf
          Icon.Wnd    := Icons[x].hwnd;//Handle;
          Icon.uID    := 1;
          Shell_NotifyIcon(NIM_DELETE,@Icon);
      end;
    end;
    Que la source soit avec moi!
    Jérôme JEAN-MARAULT

  4. #4
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut


    Si je peux me permettre :
    quelques saut de lignes ne feraient pas de mal
    Et n'oublie pas le tag résolu

    Bonne prog'
    Bestiol.
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  5. #5
    Membre confirmé
    Avatar de korntex5
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2004
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 411
    Points : 454
    Points
    454
    Billets dans le blog
    1
    Par défaut
    Le point négatif, c'est que si votre applis à planté 4 fois et a donc laissé 4 icones je ne sais pourquoi mon code n'en efface que trois, mais la solution est de relancer cette procedure ou alors la lancer a chaque démarages de l'applis avant que la nouvelle applis ne rajoute une iconecomme ça il n'y a jamais plus d'une icone


    Le point positif c'est que cela enlève les iconnes perdues de toutes les applis et pas seulement la votre
    Que la source soit avec moi!
    Jérôme JEAN-MARAULT

  6. #6
    Membre confirmé
    Avatar de korntex5
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2004
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 411
    Points : 454
    Points
    454
    Billets dans le blog
    1
    Par défaut
    oui oui le tag résolu arrive 2sec
    Que la source soit avec moi!
    Jérôme JEAN-MARAULT

  7. #7
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    En théorie si ton appli plante 4 fois c'est que tu l'as lancée 4 fois.... le plus logique c'est effectivement de mettre ce code au démarrage de ton appli, juste avant l'initialisation de ton icône de tray

    Citation Envoyé par korntex5
    oui oui le tag résolu arrive 2sec
    Désolé
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  8. #8
    Membre confirmé
    Avatar de korntex5
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juin 2004
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 411
    Points : 454
    Points
    454
    Billets dans le blog
    1
    Par défaut
    oups j'avais oublié la moitié du code
    Que la source soit avec moi!
    Jérôme JEAN-MARAULT

  9. #9
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    J'aimerais juste reprendre ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Icon.cbSize := 0;            //SizeOf
    Icon.Wnd    := Icons[x].hwnd;//Handle;
    Icon.uID    := 1;
    Shell_NotifyIcon(NIM_DELETE,@Icon);
    cbSize devrait prendre la valeur sizeof(Tray)

    D'ailleurs tu redéfinis la structure d'icône de Tray, mais tu as une structure déjà toute prête dans ShellApi.pas qui s'appelle TNotifyIconData

    Et enfin, tiré de la MSDN :
    NIM_DELETE
    Deletes an icon from the status area. Use the hWnd and uID members of the NOTIFYICONDATA structure pointed to by lpdata to identify the icon to be deleted.
    uID
    Application-defined identifier of the taskbar icon. The Shell uses hWnd and uID to identify which icon to operate on when Shell_NotifyIcon is invoked. You can have multiple icons associated with a single hWnd by assigning each a different uID.
    Es-tu sûr qu'il faille toujours mettre 1 dans uID ?

    C'est ptêtre à cause de ça que toutes les icônes ne sont pas supprimées ?

    Bonne prog'
    Bestiol
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  10. #10
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Petite remontée pour la bonne cause (Vu que je l'ai utilisé et modifié )

    Version qui fonctionne avec Seven et qui efface tous les trayicon non utilisés.

    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
     
    procedure NettoieBarreDesTaches;
    var
       hProc : Cardinal; //handle de Explorer.exe
       hTray : Cardinal; //hWnd du tray
       pid : Cardinal; //identifiant de Explorer.exe
       ptrVM : Pointer; //pointeur vers la zone mémoire pour TBBUTTON
       ret : Cardinal; //valeur de retour
       tbut: _TBBUTTON; //les infos sur le bouton
       x : Cardinal; //compteur
       nIcons : Cardinal; //nombre d//icones dans le tray
       Icons: array of Tray; //tableau temporaire des icones dans le tray
       Icon:TNotifyIconData;
     
    const
       PROCESS_VM = PROCESS_QUERY_INFORMATION Or PROCESS_VM_OPERATION
                 Or PROCESS_VM_READ Or PROCESS_VM_WRITE; //Or PROCESS_DUP_HANDLE
     
     
         //renvoie le Hwnd du tray
        function GethWndTray() : Cardinal;
        var
        hwnd,hwnd2 : Cardinal; //handle
        begin
          //on descend dans la hiérarchie parent-enfant
          hwnd := FindWindow('Shell_TrayWnd', 0);
          hwnd := FindWindowEx(hwnd, 0, 'TrayNotifyWnd', 0);
          hwnd2 := FindWindowEx(hwnd, 0, 'SysPager', 0); //uniquement XP
     
          //jusqu//à obtenir le handle de la barre d//outils faisant de tray
          hwnd2 := FindWindowEx(hwnd2, 0, 'ToolbarWindow32', 0); // ME, 2000, XP...
          If (hwnd2 = 0) Then
          begin
           hwnd2 := FindWindowEx(hwnd, 0, 'SysPager', 0);
           hwnd2 := FindWindowEx(hwnd2, 0, 'User Promoted Notification Area', 0); // Seven
          end;
     
          if (hwnd2) = 0 then
              Result := hwnd // 95,98
          Else
              Result := hwnd2;  // ME, 2000, XP...
        end;
    begin
      hTray := GethWndTray(); //on demande le hWnd du tray
      If hTray = 0 Then //si erreur
        Exit;
      GetWindowThreadProcessId(hTray, @pid); //on demande l'identifiant de Explorer.exe
      hProc := OpenProcess(PROCESS_VM, False, pid) ; //on demande un handle de Explorer.exe
      If hProc = -1 Then  //si erreur
        Exit;
      ptrVM := VirtualAllocEx(hProc, nil, sizeof(tbut), MEM_COMMIT, PAGE_READWRITE);//on alloue de la mémoire pour TBBUTTON
      If ptrVM = nil Then //si erreur
        Exit;
      nIcons := SendMessage(hTray, TB_BUTTONCOUNT, 0, 0); //on demande le nombre de boutons dans le tray
      SetLength(Icons,nIcons);//on redimensionne le tableau au nombre d'icones
     
      For x := nIcons - 1 downto 0 do //on parcours la liste des icones
      begin
          SendMessage(hTray, TB_GETBUTTON, wparam(x), lparam(ptrVM));//on demande les infos sur le bouton
          ReadProcessMemory(hProc, ptrVM, @tbut, sizeof(tbut), ret);//on lit les infos sur le bouton
          ReadProcessMemory(hProc, Pointer(tbut.dwData), @Icons[x].hwnd, 36, ret); //on lit les données de l'icone
     
          //on envoie la commande de suppression de l'icone qui ne fonctionne
          //que si cette icone n'est plus attachée a un programme
          Icon.cbSize := 0;            //SizeOf
          Icon.Wnd    := Icons[x].hwnd;//Handle;
          Icon.uID    := 1;
          Shell_NotifyIcon(NIM_DELETE,@Icon);
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

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

Discussions similaires

  1. requête pour effacer les anciens messages
    Par ferhat.adel dans le forum Requêtes
    Réponses: 14
    Dernier message: 05/12/2012, 18h26
  2. Réponses: 10
    Dernier message: 26/05/2006, 23h11
  3. [VBA]effacer les espaces à ralonge dans des cellules
    Par repié dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/01/2006, 11h00
  4. Réponses: 1
    Dernier message: 03/11/2005, 14h21

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