OVH Cloud OVH Cloud

Systray Windows

4 réponses
Avatar
lkm
Bonjour à tous,

Je suis actuellement entrain de développer une petite appli windows. Je
veux implémenter une icone dans le systray ce que je fais très bien
grâce à la fonction :

Shell_NotifyIcon(NIM_ADD, &nid);

Malheuresement, je n'arrive pas à trouver comment générer un menu
'dynamique' lorsque je click droit sur l'icone dans le systray.

Plus concrètement je veux que l'utilisateur, lorsqu'il click sur
l'icone, voit les 10 dernières entrées qu'il y a eu dans le presse
papier (Le méchanisme de sauvegarde des 10 dernières entrées fonctionne
déjà et se présente sous forme d'une liste chainée).

Mes questions :
* Y a t'il une fonction dans l'API windows qui pourrait me permettre
de modifier l'apparence du menu facilement après un click de
l'utilisateur sur l'icône ?
* Comment vous y prendriez vous ?
* (Question peu être hors chartre) Je suis plus habitué à manipuler
GTK2 mais il ne me semble pas qu'il existe quoi que se soit dans cette
lib pour gérer le systray windows, je me trompe ?

4 réponses

Avatar
Christian ASTOR
lkm wrote:

je n'arrive pas à trouver comment générer un menu
'dynamique' lorsque je click droit sur l'icone dans le systray.



CreatePopupMenu(), InsertMenuItem()... TrackPopupMenu()...
Avatar
lkm
Christian ASTOR a écrit :
lkm wrote:

je n'arrive pas à trouver comment générer un menu 'dynamique' lorsque
je click droit sur l'icone dans le systray.




CreatePopupMenu(), InsertMenuItem()... TrackPopupMenu()...



Merci, j'obtiens exactement ce que je veux ;)

Bonne soirée.
Avatar
lkm
Bonsoir,

Avant tout : Joyeux Noël à tous.
Je suis sur un problème qui me pose quelques soucis certainement dus à
mon manque d'expérience de l'API windows ...

J'ai la fonction suivante :

void InputClipboardData(char * Data)
{
DWORD DataLen ;
HGLOBAL hgbl ;
char * pnem ;
char * test = (char *)malloc(1024) ;
int i ;

DataLen = strlen(Data) ;
hgbl = GlobalAlloc(GHND, DataLen) ;
pnem = (char *)GlobalLock(hgbl) ;

strncpy(pnem, Data, DataLen) ;

GlobalUnlock(hgbl) ;
OpenClipboard(NULL) ;

EmptyClipboard() ;
//SetClipboardData(CF_TEXT, hgbl) ;

for(i=0; i<=3; i++){
sprintf(test, "ici %s=>%s=>%d=>%d", pnem, hgbl, DataLen, pnem) ;
MessageBox(NULL, test, "InputClipboardData", 1) ;
SetClipboardData(CF_TEXT, pnem) ;
}
CloseClipboard() ;
}

J'ai l'impression que la fonction SetClipboardData me supprime mon
dernier octet mais je ne comprend pas pourquoi ... L'execution de cette
fonction me sort :"test" "tes" "te" ... comme série de valeur pour pnem.
Le dernier caractère est donc supprimé à chaque appel de
SetClipboardData. Suis-je passé à coté de quelque chose ?

Merci, et bonnes fêtes à tous !
Avatar
Serge Paccalin
Le dimanche 25 décembre 2005 à 22:00:20, lkm a écrit dans
fr.comp.os.ms-windows.programmation :

J'ai l'impression que la fonction SetClipboardData me supprime mon
dernier octet mais je ne comprend pas pourquoi ... L'execution de cette
fonction me sort :"test" "tes" "te" ... comme série de valeur pour pnem.
Le dernier caractère est donc supprimé à chaque appel de
SetClipboardData. Suis-je passé à coté de quelque chose ?



Tu relis la doc de SetClipboard(), notamment ceci :

After SetClipboardData is called, the system owns the object
identified by the hMem parameter. The application can read the data,
but must not free the handle or leave it locked until the
CloseClipboard function is called. (The application can access the
data after calling CloseClipboard).

Le handle ne t'appartient plus, donc tu n'as pas le droit de rappeler
SetClipboardData() avec, point.

--
___________ 26/12/2005 12:16:40
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763