Systray

Fermé
leprov - 24 juil. 2004 à 21:45
 leprov - 26 juil. 2004 à 13:46
bonjour a tous. voila mon probleme. je debute en api, et je voudrais mettre un prog ds la systray sans fenetre. j'ai récupéré plusieurs sources a ce propos, mais j'ai du mal a capter. si quelqu'un avait de la docs a me proposer, ou des explications assez simples a me donner, je suis preneur. sinon je peux toujours donner mon msn si vous preferez comme ca.
merci d'avance.

2 réponses

Salut,

Alors pour iconifier ton appli, un truc du genre:
/*~~~~~~~~~~~~~~~~~*/
NOTIFYICONDATA tnid;
/*~~~~~~~~~~~~~~~~~*/

tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = this->Handle;
tnid.uID = ICON_ID; /* personal ID */
tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnid.uCallbackMessage = WM_ICON_MSG;
tnid.hIcon = Icon->Handle;
AnsiString s_tmpappname = "EVATIS-B\0" ;
memcpy(tnid.szTip,s_tmpappname.c_str()
,s_tmpappname.Length());
tnid.szTip[s_tmpappname.Length()] = '\0';
CanClose = false;
Shell_NotifyIcon(NIM_ADD, &tnid);


et pour la rouvrir en cas de click, yu intercepte le message utilise dans uCallbackMessage:

case WM_ICON_MSG:
switch(Message.WParam)
{
case ICON_ID:
if(Message.LParam != WM_LBUTTONDBLCLK) break;

/*~~~~~~~~~~~~~~~~~*/
NOTIFYICONDATA tnid;
/*~~~~~~~~~~~~~~~~~*/

tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = this->Handle;
tnid.uID = ICON_ID; /* personal ID */
tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnid.uCallbackMessage = WM_ICON_MSG;
tnid.hIcon = Icon->Handle;
Shell_NotifyIcon(NIM_DELETE, &tnid);
Show();
ShowWindow(Handle, SW_SHOWMAXIMIZED);
SetForegroundWindow(Handle);
}
A+
Damien
0
euh merci beaucoup. est ce que tu pourrais m'expliquer un peu le code stp? recopier une source en essaynt de la faire marcher en coorrigeant les erreurs de compilations m'interesse pas vraiment, et la cest ske je suis parti pr faire, paske je comprend pas grand chose a tt ce code. je capte pas a quoi correspondent les macros, les identifieurs, les fonctions, et les objets.merci d'avance
0
Salut,

Bon alors la fonction a utiliser est

Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA lpdata
);

avec dwMessage = NIM_ADD pour ajouter une entre dans le systray. lpdata est un pointeur vers une structure NOTIFYICONDATA que tu doit initialiser correctement.

Donc dans mon cas:
tnid.cbSize = sizeof(NOTIFYICONDATA);
//initrialisation de la taille de la structure

tnid.hWnd = this->Handle;
// je positionne le handle de ma fenetre pour qu'elle receoive les messages envoyes par le systray

tnid.uID = ICON_ID;
//ICON_ID est l'Id d'une ressource icone que j'utilise et qui apparaitra dans le systray

tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
// j'indique quels sont les champs qui sont valides (ceux que je positionne)

tnid.uCallbackMessage= WM_ICON_MSG;
//j'indique quel message devra etre envoyé à ma fenetre en cas d'action sur l'icon. Ce message sera traité dans ma fonction WndProc

tnid.hIcon = Icon->Handle;
//la je set le handle de mon icon ( a recuperer via LoadIcon)

AnsiString s_tmpappname = "EVATIS-B\0" ;
memcpy(tnid.szTip,s_tmpappname.c_str()
,s_tmpappname.Length());
tnid.szTip[s_tmpappname.Length()] = '\0';
// la c'est une partie un peu inutilement compliqué juste pour setter le texte qui apparaitra en laissant la souris sur l'icone

Shell_NotifyIcon(NIM_ADD, &tnid);
// la fonction magique.

Viola puor qq explications
A+
Damien
0
merci bcp, ca meclaire pas mal.
juste une petite question, cest quoi la wndproc? cest une fonction de gestion de la fenetre comme son nom lindique a peu pres? elle a quel profil, et on l'appelle comment? merci davance
0