Retirer l'icone systray d'une app externe

devloop2 Messages postés 2 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 10 septembre 2004 - 29 juil. 2004 à 16:51
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010 - 2 déc. 2004 à 15:34
Bonjour à tous !
(c'est mon premier post ici ;) )
d'abord j'espère ne pas me tromper de section...

Voilà j'utilise un logiciel qui met son icone dans la zone de notification (systray) près de l'horloge et j'aimerais faire une petite appli qui puisse la cacher (l'icone) quand je le souhaite.

Le logiciel fonctionne avec une fenêtre (invisible toutefois) donc l'utilisation de FindWindow est possible pour récupérer un handle sur cette fenêtre.
Logiquement il suffit ensuite d'envoyer un message à cette fenêtre en utilisant Shell_NotifyIcon.

Le problème c'est qu'il faut passer les bons paramêtres à cette fonction, surtout la structure de l'icone.
J'ai lu dans la doc MSDN que l'uID de l'icone et le handle de la fenêtre devrait suffire...
Pour le handle on l'a grâce à FindWindow...

Pour l'ID ça se complique...
Je débute en visual c++ mais je me suis dit que je pourrais trouver cet ID avec ResourceHacker. Après avoir comparé des sources avec les résultats de RH je pense que l'ID de mon icone est 150 (IconGroup dans RH...)

donc j'envoie mon Shell_NotifyIcon à la fenêtre de mon soft et évidemment il se passe rien (ben fallait pas réver non plus :D )

enfin tout ça pour dire que je bloque...
si vous avez des idées pour faire disparaître cette icone de mon systray merci de me les soumettre :)

ps: j'espère avoir été clair (gnè !?) j'en ai mal à la tête :(

10 réponses

Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
25 août 2004 à 12:10
je suis en train d'essayer une méthode(mais j'ai quelque pb encore) qui consiste à récupérer le HWND du systray puis à en énumérer les boutons puis à en obtenir les info mais à chaque fois que je veux obtenir les info, la sys tray bug et plante donc pour l'instant c'est pasq encore çà mais je cherche ...
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
25 août 2004 à 21:39
je suis intéressé par ton post car moi aussi je cherche a faire cela..

je m'étais deja penché sur la question , sans trouver encore la solution. en regardant dans spy++ il y a rien de significatif et de commun pour tous les ico des sys tray.

jette un oiel sur ma source HIDE ET UNHIDE A PROGRAMME+ SYSTEM TRAY AUX CHOIX!!!!, il y a une bonne énumération des class filles et parents d'un prog, genre bouton, list view, et ico sys tray,... mais j'ai rien trouvé pour identifé kom élément pour l'ico du systray.
youpi :)
0
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
25 août 2004 à 23:27
Bon je poste l'état de ma source:
void TestSysTrayCommand()
{
    HWND hwnd=FindWindow("Shell_TrayWnd","");
    if(hwnd==NULL)
    {
        std::cout<<"Cannot find the Shell_TrayWnd !\n";
    }
    else
    {
        std::cout<<"Shell_TrayWnd finded!\n";
        HWND hwnd2=FindWindowEx(hwnd,NULL,"TrayNotifyWnd","");
        if(hwnd2==NULL)
        {
            std::cout<<"Cannot find the TrayNotifyWnd !\n";
        }
        else
        {
            std::cout<<"TrayNotifyWnd finded!\n";
            HWND hwnd3=FindWindowEx(hwnd2,NULL,"SysPager","");
            if(hwnd3==NULL)
            {
                std::cout<<"Cannot find the SysPager !\n";
            }
            else
            {
                std::cout<<"SysPager finded!\n";
                HWND hwnd4=FindWindowEx(hwnd3,NULL,"ToolbarWindow32",NULL);
                if(hwnd4==NULL)
                {
                    std::cout<<"Cannot find the ToolbarWindow32 !\n";
                }
                else
                {
                    LRESULT numberButtons=SendMessage(hwnd4,TB_BUTTONCOUNT,0,0);
                    
                    std::cout<<"ToolbarWindow32 finded!\n";
                    std::cout<<"Shell_TrayWnd/TrayNotifyWnd/SysPager/ToolbarWindow32>\n";
                    std::cout<<"+-Number of buttons:"<<numberButtons<<"\n";
                    
                    for(int i=0;i<numberButtons;i++)
                    {
                        std::cout<<"  +-Button_"<<i<<"\n";
                        //std::cout<<"    +-text:""<<str<<""\n";
                    }
                    
                    HWND tooltip=(HWND)SendMessage(hwnd4,TB_GETTOOLTIPS,0,0);
                    if(tooltip==NULL)
                    {
                        std::cout<<"TB_GETTOOLTIPS failed: no tooltip associated\n";
                    }
                    else
                    {
                        LRESULT toolNumber=SendMessage(tooltip,TTM_GETTOOLCOUNT,0,0);
                        std::cout<<"+-tooltip:\n";
                        std::cout<<"  +-tool number:"<<toolNumber<<"\n";

                        for(int i=0;i<toolNumber;i++)
                        {
                            TOOLINFO ti;
                            ti.cbSize=sizeof(TOOLINFO);
                            if(!SendMessage(tooltip,TTM_ENUMTOOLS,i,(LPARAM)(LPTOOLINFO)&ti))
                            {
                                std::cout<<"TTM_ENUMTOOLS failed for i="<<i<<"\n";
                            }
                            else
                            {
                                std::cout<<"    +-tool_"<<i<<":\n";
                                std::cout<<"      +-ID:"<<ti.uId<<"\n";
                                std::cout<<"      +-rect:{"<<ti.rect.left<<","<<ti.rect.top<<","<<ti.rect.right
                                         <<","<<ti.rect.bottom<<"}\n";
                                std::cout<<"      +-text:"<<ti.lpszText<<"\n";
                            }
                        }
                    }
                }
            }
        }    
    }
    
    std::cin.get();
}

Le problème c'est que l'appel suivant:
SendMessage(tooltip,TTM_ENUMTOOLS,i,(LPARAM)(LPTOOLINFO)&ti);

Fais bugger la systrayne idée ?
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
26 août 2004 à 21:54
alors fodrai ke je m'y repenche et c du temps vu ke je pars dem'1 prendre mes vacances, j'aurai pas le temps, donc c un post ke je vais suivre dans le temps....

je vais copier ton code et faire des tests et mixer avec une source ke j'avais précisé plus haut.

fais chier car j'ai pas spy++ d'installé,j'aurai bien fais une verif maintenant, mais je suis entrain de regarder ton code et a mon avis tu est pas loin de la solution,

il y a kan meme un truc ki m'interpel:

d'apres ce ke je comprend de ton code
"Shell_TrayWnd" serait donc le nom de la class du system tray???

et tu enumeres toutes les balloons ou tooltips, ke tu veux faire correspondre a celui du prog désiré...

si j'ai bien compris ce ke tu as codé est ce ke tu recherches, cela ne serait pas plus simple d'énuméré toutes les classes de ton prog choisi, et de voir s'il partie de "Shell_TrayWnd"??? (parent)

enfin c com ca ke je le vois mais si j'ai pas bien compris ton code, pourais tu me l'expliké!! merci @+

youpi :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
26 août 2004 à 23:32
non ce serai trop beau en fait mon récupère un handle sur la systray(de classe "ToolbarWindow32 " mais en fait voilà l'arborescence:
+-Shell_TrayWnd
+-Shell_TrayWnd
+-SysPager
+-ToolbarWindow32 (ce qui nous interesse)
Une fois que j'ai ce handle, je lui demande de me donner un handle sur le tooltip puis je demande au tooltip de m'énumérer tous les message enregistré et c'est là que çà bug
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
27 août 2004 à 12:48
ok,je comprend ce ke tu veux faire mais a mon avis c pas com ca k'il fo si prendre... a mon humble avis :)

je te conseil de voir ma source "HIDE ET UNHIDE A PROGRAMME+ SYSTEM TRAY AUX CHOIX!!!!",

il y a certainement des trucs ki peut te faire avancé notament l'enumération des filles et parents d'un élément, class, hwnd etc...

mon prog est fais a la base kom le spy++, tu click avec le pointeur une fenetre et elle le met dans le sys tray.... genre outlook etc...

en fait je suis arriver a un probleme kan tu click sur un bouton ou une list view, enfin bref un element d'un prog cela merdé car cela recupéré le hwnd du bouton,etc...
j'ai donc fais une énumération des classes appartenant à l'objet clické pour recup le parent et z-top level des windows....

bref avec un iswindow je test si c la fenetre....

tout ca pour en venir au faite ke dans mon énumération j'ai a l'intérieur de mon énumération une class appartenant et dépendant au systray... (fait un messagebox pour verif tu vera)

ce ke je savais pas a l'époke c ce ke tu viens de m'apprendre c ca:
"+-Shell_TrayWnd
+-Shell_TrayWnd
+-SysPager
+-ToolbarWindow32 (ce qui nous interesse)
"
a l'époke je n'avais pas trouvé de correspondance mais , desouvenir il me semble k'en explorant avec spy++, le type systray varie en fonction des prog et de celui ki l'a programmé

enfin bref, je pense k'il fodrai ke tu jette un oeil a ma source peut etre ke ca va t'aidé, moi je m'y penche dans 1 emaine car je pars en vacance dans 2 h et je ne pourai pas te répondre d'ici la...

@+
youpi :)
0
devloop2 Messages postés 2 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 10 septembre 2004
10 sept. 2004 à 16:18
lut !
désolé pour cette réponse tardive :blush)
merci pour votre aide à tous les deux... je vais étudier ça
+ ;)
0
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
10 sept. 2004 à 18:50
A mon avis le pb est que le pointeur retourné dans mon prog n'est valable que dans le processus du sys tray et pas dans celui où j'appel .
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
2 déc. 2004 à 15:29
ecoute j'ai avancer dans ce domaineva voir la source de "VB"
ki est po mal http://www.cppfrance.com/code.aspx?ID=24855

ainsi ke la mienne plus graphike: http://www.cppfrance.com/code.aspx?ID=27923

bientot j'integrerai tout dans mon tray manager donc jetter un coup d'oel dans les prochains jours
youpi :)
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
2 déc. 2004 à 15:34
a aussi par rapport a devloop2 pour retirer l'ico du systray (titre du sujet :o))
fait ca:

SendMessage(HWND) GethWndTray(),(UINT) TB_HIDEBUTTON,(WPARAM) 1,(LPARAM) FALSE); TRUE ou FALSE cacher ou non va voir msdn

GethWndTray represente la fonction e "ShareVB
" ki fait grossomodo c ke proposait Pamaury:

HWND hwnd=FindWindow("Shell_TrayWnd","");

HWND hwnd2=FindWindowEx(hwnd,NULL,"TrayNotifyWnd","");

HWND hwnd3=FindWindowEx(hwnd2,NULL,"SysPager","");

HWND hwnd4=FindWindowEx(hwnd3,NULL,"ToolbarWindow32",NULL); //unikement pour les NT

lui il traite differement en revanche puik'il fait un readmemory dans explorer c ki est moins con finalement

tu pourra trouver les tips et les icones dans sa struct
youpi :)
0
Rejoignez-nous