Systray

Signaler
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
-
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
-
Bonjour a tous,
je sais qu'il existe des sources pour ajouter son application dans la systray, mais j'ai beau essayer de comprendre, je n'y arrive pas :sad) ... Alors je demande de l'aide...
En fait je voudrais ajouter mon application (boite de dialogue) dans la systray, et que l'on ne la voit pas dans la taskbar (je sais pas si c'est comme ca qu'elle s'appelle, enfin la barre à côté du bouton du menu demarrer)...
Voila aidez moi s'il vou plait...
Merci par avance...
Bob...

"La chance accorde ses faveur aux esprits avertis..."

12 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
En fait ce qu'on fait, c'est qu'on ajoute une icone dans la barre des taches, et puis tu caches ta fenête avec ShowWindow, mais il me semble qu'il y a plusieurs sources qui traitent de ca
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
certes mais j'arrive pas a comprendre ou a adapté le code a mon programme... c'est pour ca que j'aimerais que l'on m'explique...
Bob...

"La chance accorde ses faveur aux esprits avertis..."
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
regarde, j'ai ecrit ce code et j'ai 6 erreurs tu pourrais pas m'aider???

[Code]#include <windows.h>
#include "resource.h"

#define WM_TRAY_ICONE (WM_USER+1)

HINSTANCE hInst;
BOOL AffichageMenu = FALSE;

BOOL AddIcone(HINSTANCE hInst, HWND hWnd, UINT id, LPTSTR IconName, char *infobulle)
{
BOOL res;

NOTIFYICONDATA trid;

trid.cbSize = sizeof(NOTIFYICONDATA);
trid.hWnd = hWnd;
trid.uID = id;
trid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
trid.uCallbackMessage = WM_TRAY_ICONE;
trid.hIcon = LoadIcon(hInst, IconName);

if(infobulle)
{
lstrcpyn(trid.szTip, infobulle, sizeof(trid.szTip));
}
else
{
trid.szTip[0] = '\0';

res = Shell_NotifyIcon(NIM_ADD, &trid);

return res;
}

BOOL RetIcone(HWND hwnd, UINT id)
{
BOOL res;

NOTIFYICONDATA trid;
trid.cbSize = sizeof(NOTIFYICONDATA);
trid.hWnd = hWnd;
trid.uID = id;

res = Shell_NotifyIcon(NIM_DELETE, &trid);

return res;
}

LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_INITDIALOG:
AddIcone(hInst, hwnd, 2, MAKEINTRESOURCE(IDI_ICON), "Util MSN");

case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDCANCEL:
{
RetIcone(hwnd, 2);
EndDialog(hWnd, FALSE);
return TRUE;
}

case ID_TRAY_ITEM_1:
{
MessageBox(hWnd, "Util MSN par Jérémy Decool", "Information", MB_OK | MB_ICONINFORMATION);
}

case ID_TRAY_ITEM_2:
{
SendMessage(hWnd, WM_COMMAND, IDCANCEL, NULL);
}
}

case WM_TRAY_ICONE:
{
if(AffichageMenu || (lParam != WM_RBUTTONUP && lParam != WM_LBUTTONDBLCLK))
return FALSE;

HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENUTRAY));

if(!menu)
{
return FALSE;
}

HMENU submenu = GetSubMenu(menu, 0);

if(!submenu)
{
return FALSE;
}

if(lParam == WM_RBUTTONUP)
{
AffichageMenu = TRUE;
POINT mouse;
GetCursorPos(&mouse);
SetMenuDefaultItem(submenu, ID_TRAY_ITEM_1, FALSE);
SetForegroundWindow(hWnd);
TrackPopupMenu(submenu, TPM_RETURNCMD || TPM_RIGHTALIGN, mouse.x, mouse.y, 0, hWnd, NULL);
DestroyMenu(subMenu);
DestroyMenu(menu);

return TRUE;
}
else
{
SendMessage(hWnd, WM_COMMAND, ID_TRAY_ITEM_1, NULL);

return TRUE;
}
}

default:
return FALSE;
}

return TRUE;
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
hInst = hInstance;

DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC)DlgProc);

return 0;
}

voila j'ai trois erreurs avec les handle, une erreur avec la fonction WinMain (def de fonctions locales non conforme) et 'submenu' non déclarer...

voila j'espere que quelqu'un pourrat m'aider...
Bob...

"La chance accorde ses faveur aux esprits avertis..."
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
def de fonction locale: tu as oublié un }
pb de handle: tu as écrit hwnd au lieu de hWnd
submenu: tu as écrit subMenu au lieu de submenu

bref, des erreurs à la con, mais sinon t'as d'autres erreurs je crois, par exemple tu oublie des break après des case
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
bon je viens de réparer mes diverses erreurs, désoler de t'avoir déranger avec ca... mais je comprend pas ma faute dans la def de fonction, je ne comprend pas ma faute :blush) ... pourrais-tu m'aider svp???
Bob...

"La chance accorde ses faveur aux esprits avertis..."
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
C'est parce que tu as oublié un } comme je te l'ai dit. Par exemple ca peut etre un truc de ce genre

int f()
{
return 0;

void g()
{
}

le compilo croit que tu veux définir g dans f
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
oui ca je le sais, seulement je ne vois pas à qu'elle fonction il manque l'}'... tu peux m'aider stp...
merci par avance...
Bob...

"La chance accorde ses faveur aux esprits avertis..."
Messages postés
36
Date d'inscription
mercredi 31 décembre 2003
Statut
Membre
Dernière intervention
1 février 2004

Regarde ta première fonction :
BOOL AddIcone(HINSTANCE hInst, HWND hWnd, UINT id, LPTSTR IconName, char *infobulle)
{
BOOL res;

NOTIFYICONDATA trid;

trid.cbSize = sizeof(NOTIFYICONDATA);
trid.hWnd = hWnd;
trid.uID = id;
trid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
trid.uCallbackMessage = WM_TRAY_ICONE;
trid.hIcon = LoadIcon(hInst, IconName);

if(infobulle)
{
lstrcpyn(trid.szTip, infobulle, sizeof(trid.szTip));
}
else
{
trid.szTip[0] = '\0';

res = Shell_NotifyIcon(NIM_ADD, &trid);

return res;
}


Ta boucle if...else ne se termine pas convenablement.
Ecrit plutôt ça :
if ( infobulle )
     lstrcpyn(trid.szTip, infobulle, sizeof(trid.szTip));
else
     trid.szTip[0] = '\0';


Et ça devrait aller mieux.

RTW, pour que l'entraide dure...
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
voici mon code:
#include <windows.h>
#include "resource.h"

#define WM_TRAY_ICONE (WM_USER+1)

HINSTANCE hInst;
BOOL AffichageMenu = FALSE;

BOOL AddIcone(HINSTANCE hInst, HWND hWnd, UINT id, LPTSTR IconName, char *infobulle)
{
BOOL res;

NOTIFYICONDATA trid;

trid.cbSize = sizeof(NOTIFYICONDATA);
trid.hWnd = hWnd;
trid.uID = id;
trid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
trid.uCallbackMessage = WM_TRAY_ICONE;
trid.hIcon = LoadIcon(hInst, IconName);

if (infobulle)
lstrcpyn(trid.szTip, infobulle, sizeof(trid.szTip));
else
trid.szTip[0] = '\0';

res = Shell_NotifyIcon(NIM_ADD, &trid);

return res;
}

BOOL RetIcone(HWND hWnd, UINT id)
{
BOOL res;

NOTIFYICONDATA trid;
trid.cbSize = sizeof(NOTIFYICONDATA);
trid.hWnd = hWnd;
trid.uID = id;

res = Shell_NotifyIcon(NIM_DELETE, &trid);

return res;
}

LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_INITDIALOG:
AddIcone(hInst, hWnd, 2, MAKEINTRESOURCE(IDI_ICON), "Util MSN");

case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDCANCEL:
{
RetIcone(hWnd, 2);
EndDialog(hWnd, FALSE);

return TRUE;
}

case ID_TRAY_ITEM_1:
{
MessageBox(hWnd, "Util MSN par Jérémy Decool", "Information", MB_OK | MB_ICONINFORMATION);
}

case ID_TRAY_ITEM_2:
{
SendMessage(hWnd, WM_COMMAND, IDCANCEL, NULL);
}
}

case WM_TRAY_ICONE:
{
if(AffichageMenu || (lParam != WM_RBUTTONUP && lParam != WM_LBUTTONDBLCLK))
return FALSE;

HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENUTRAY));

if(!menu)
return FALSE;

HMENU submenu = GetSubMenu(menu, 0);

if(!submenu)
return FALSE;

if(lParam == WM_RBUTTONUP)
{
AffichageMenu = TRUE;
POINT mouse;
GetCursorPos(&mouse);
SetMenuDefaultItem(submenu, ID_TRAY_ITEM_1, FALSE);
SetForegroundWindow(hWnd);
TrackPopupMenu(submenu, TPM_RETURNCMD || TPM_RIGHTALIGN, mouse.x, mouse.y, 0, hWnd, NULL);
DestroyMenu(submenu);
DestroyMenu(menu);

return TRUE;
}
else
{
SendMessage(hWnd, WM_COMMAND, ID_TRAY_ITEM_1, NULL);

return TRUE;
}
}

default:
return FALSE;
}

return TRUE;
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
hInst = hInstance;

DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC)DlgProc);

return 0;
}


mais j'ai toujours les deux erreurs...
Bob...

"La chance accorde ses faveur aux esprits avertis..."
Messages postés
36
Date d'inscription
mercredi 31 décembre 2003
Statut
Membre
Dernière intervention
1 février 2004

En effet, tu as oublié un "}", tu as écris hwnd au lieu de hWnd, et je sais plus quoi...

Je pense qu'avec ça, ça devrait aller mieux :
#include <windows.h>
#include "resource.h"

#define WM_TRAY_ICONE (WM_USER+1)

HINSTANCE hInst;
BOOL AffichageMenu = FALSE;

BOOL AddIcone(HINSTANCE hInst, HWND hWnd, UINT id, LPTSTR IconName, char *infobulle)
{
     BOOL res;

     NOTIFYICONDATA trid;

     trid.cbSize = sizeof(NOTIFYICONDATA);
     trid.hWnd = hWnd;
     trid.uID = id;
     trid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
     trid.uCallbackMessage = WM_TRAY_ICONE;
     trid.hIcon = LoadIcon(hInst, IconName);

     if (infobulle)
          lstrcpyn(trid.szTip, infobulle, sizeof(trid.szTip));
     else
          trid.szTip[0] = '\0';

     res = Shell_NotifyIcon(NIM_ADD, &trid);

     return res;
}

BOOL RetIcone(HWND hWnd, UINT id)
{
     BOOL res;

     NOTIFYICONDATA trid;
     trid.cbSize = sizeof(NOTIFYICONDATA);
     trid.hWnd = hWnd;
     trid.uID = id;

     res = Shell_NotifyIcon(NIM_DELETE, &trid);

     return res;
}

LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
     switch(msg)
     {
          case WM_INITDIALOG:
               AddIcone(hInst, hWnd, 2, MAKEINTRESOURCE(IDI_ICON), "Util MSN");
               break;

          case WM_COMMAND:
          {
               switch(LOWORD(wParam))
               {
                    case IDCANCEL:
                    {
                         RetIcone(hWnd, 2);
                         EndDialog(hWnd, FALSE);
                         return TRUE;
                    }

                    case ID_TRAY_ITEM_1:
                    {
                         MessageBox(hWnd, "Util MSN par Jérémy Decool", "Information", MB_OK | MB_ICONINFORMATION);
                    }

                    case ID_TRAY_ITEM_2:
                    {
                         SendMessage(hWnd, WM_COMMAND, IDCANCEL, 0);
                    }
               }
          }

               case WM_TRAY_ICONE:
               {
                    if(AffichageMenu || (lParam != WM_RBUTTONUP && lParam != WM_LBUTTONDBLCLK))
                         return FALSE;

                    HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENUTRAY));

                    if(!menu)
                         return FALSE;

                    HMENU submenu = GetSubMenu(menu, 0);

                    if(!submenu)
                         return FALSE;

                    if(lParam == WM_RBUTTONUP)
                    {
                         AffichageMenu = TRUE;
                         POINT mouse;
                         GetCursorPos(&mouse);
                         SetMenuDefaultItem(submenu, ID_TRAY_ITEM_1, FALSE);
                         SetForegroundWindow(hWnd);
                         TrackPopupMenu(submenu, TPM_RETURNCMD || TPM_RIGHTALIGN, mouse.x, mouse.y, 0, hWnd, NULL);
                         DestroyMenu(submenu);
                         DestroyMenu(menu);

                         return TRUE;
                    }
                    else
                    {
                         SendMessage(hWnd, WM_COMMAND, ID_TRAY_ITEM_1, 0);

                         return TRUE;
                    }
               }

               default:
                    return FALSE;
          }

     return TRUE;
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
hInst = hInstance;

DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC)DlgProc);

return 0;
}


Une petite remarque, personnellement, je préfère :
case WM_TRUC:
// Mon code
break;

à :
case WM_TRUC:
{
// Ton code
}

M'enfin, rien d'important !

RTW, pour que l'entraide dure...
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
ok je te remerci maintenant ca marche, je vais maintenant comparer les deux codes pour voir ou sont mes erreurs... je te remercie beaucoup pour ton aide tres precieuse...
MERCI
Bob...

"La chance accorde ses faveur aux esprits avertis..."
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
salut, j'ai encore un probleme avec l'icone dans la systray... en fait le truc c'est que je peux accéder au menu qu'une seul fois... comment ca se fait et comment puis-je faire pour réparé cette erreur?
Bob...

"La chance accorde ses faveur aux esprits avertis..."