2009-04-22 7 views
2

D'après tout ce que j'ai vu, le programme C++ suivant devrait afficher une info-bulle de l'icône de la barre lorsque j'ai cliqué gauche dans la fenêtre de l'application, mais cela ne fonctionne pas. Quelqu'un peut-il me dire ce que je manque?Pourquoi les info-bulles de Shell_NotifyIcon ne fonctionnent-elles pas?

Ceci est sur XP avec la version 6.0 de Shell32.dll (vérifiée avec DllGetVersion).

Merci!

#include "stdafx.h" 
    #include "shellapi.h" 

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 

    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) 
    { 
     MSG msg; 

     WNDCLASS wc; 
     memset(&wc, 0, sizeof(wc)); 
     wc.lpfnWndProc = WndProc; 
     wc.hInstance = hInstance; 
     wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
     wc.lpszClassName = "sysTrayTest"; 
     RegisterClass(&wc); 

     HWND hWnd = CreateWindow("sysTrayTest", "", 
           WS_OVERLAPPEDWINDOW, 
           CW_USEDEFAULT, 0, 500, 500, 
           NULL, NULL, hInstance, NULL); 
     if (hWnd) 
     { 
      ShowWindow(hWnd, nCmdShow); 
      while (GetMessage(&msg, NULL, 0, 0)) 
      { 
       TranslateMessage(&msg); 
       DispatchMessage(&msg); 
      } 
     } 

     return 0; 
    } 

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
     switch (message) 
     { 
      case WM_DESTROY: 
      { 
       NOTIFYICONDATA nid; 
       memset(&nid, 0, sizeof(NOTIFYICONDATA)); 
       nid.cbSize = sizeof(NOTIFYICONDATA); 
       nid.hWnd = hWnd; 
       nid.uID = 1; 
       Shell_NotifyIcon(NIM_DELETE, &nid); 

       PostQuitMessage(0); 
      } 
      break; 

      case WM_CREATE: 
      { 
       NOTIFYICONDATA nid; 
       memset(&nid, 0, sizeof(NOTIFYICONDATA)); 
       nid.cbSize = sizeof(NOTIFYICONDATA); 
       nid.hWnd = hWnd; 
       nid.uID = 1; 
       nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; 
       nid.uCallbackMessage = WM_USER + 200; 
       nid.hIcon = LoadIcon(NULL, IDI_INFORMATION); 
       lstrcpy (nid.szTip, "Test Tip"); 
       Shell_NotifyIcon(NIM_ADD, &nid); 
      } 
      break; 

      case WM_LBUTTONDOWN: 
      { 
       NOTIFYICONDATA nid; 
       memset(&nid, 0, sizeof(NOTIFYICONDATA)); 
       nid.cbSize = sizeof(NOTIFYICONDATA); 
       nid.hWnd = hWnd; 
       nid.uID = 1; 
       nid.uFlags = NIF_INFO; 
       lstrcpy(nid.szInfo, "Test balloon tip"); 
       lstrcpy(nid.szInfoTitle, "Test Title"); 
       nid.dwInfoFlags = NIIF_INFO; 
       nid.uTimeout = 15000; 
       Shell_NotifyIcon(NIM_MODIFY, &nid); 
      } 
      break; 

      default: 
       return DefWindowProc(hWnd, message, wParam, lParam); 
     } 
     return 0; 
    } 
+0

BTW, c'est sur XP et DllGetVersion() renvoie 6.0. –

Répondre

12

Bah, je l'ai compris. Pour une raison quelconque avec les en-têtes que j'ai ...

sizeof (NOTIFYICONDATA) == 508

alors ...

NOTIFYICONDATA _ V3 _ TAILLE == 504
NOTIFYICONDATA _ V2 _ SIZE = = 488
NOTIFYICONDATA _ V1 _ TAILLE == 88

Si je précise soit V2 ou V3 au lieu de sizeof (NOTIFYICONDATA) les infobulles montrent très bien.

+3

Donnez un cigare à cet homme. Vous venez probablement de me sauver quelques heures. Marquez votre réponse comme correcte afin que vous obteniez le représentant! –

+0

Pour unicode: NOTIFYICONDATAW_V2_SIZE == 936, lors de l'utilisation de sizeof (NOTIFYICONDATAW), il renvoie 952. Btw. il y a un bogue dans ShellAPI.h, quand vous définissez _WINN32_WINNT à 0x0500 (win2k) et essayez d'utiliser NOTIFYICONDATAW_V2_SIZE (win2k ou plus tard) vous obtenez une erreur: "erreur C2039: 'guidItem': n'est pas un membre de '_NOTIFYICONDATAW'" . Pour résoudre ce problème, vous devez coder la valeur NOTIFYICONDATAW_V2_SIZE lors de la définition de cbSize, utilisez cette valeur 936. –

1

Avez-vous vérifié dans le Registre sous ...

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ avancée

... pour EnableBalloonTips? C'est quelque chose de très commun pour les utilisateurs de désactiver.

+1

J'ai cherché cette clé, mais elle n'existe pas sur ma machine. –

+0

Voir cette page pour plus de détails: http://www.howtogeek.com/howto/windows-vista/disable-all-notification-balloons-in-windows-vista/ – mobiGeek

1

Le problème est que vous supposez que Windows va vous envoyer un WM_LBUTTONDOWN lorsque l'utilisateur clique sur l'icône, mais ce n'est pas correct. WM_LBUTTONDOWN est envoyé uniquement lorsque l'utilisateur clique dans la zone client de hWnd, si vous lisez attentivement la documentation de NOTIFYICONDATA vous vous rendrez compte que lorsque l'utilisateur clique sur l'icône Windows vous enverra un message WM_USER+20 (selon votre code) et dans le paramètre lParam vous obtiendrez la notification WM_LBUTTONDOWN.

Questions connexes