Pourquoi les info-bulles Shell_NotifyIcon ne fonctionnent-elles pas?

D’après tout ce que j’ai vu, le programme C ++ suivant devrait afficher une info-bulle sur l’icône de la barre des tâches lorsque je clique avec le bouton gauche de la souris sur la fenêtre de l’application, mais cela ne fonctionne pas. Quelqu’un peut-il me dire ce que je manque?

C’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; } 

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

sizeof (NOTIFYICONDATA) == 508

tandis que…

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

Si je spécifie V2 ou V3 au lieu de sizeof (NOTIFYICONDATA), les astuces relatives aux bulles s’affichent parfaitement.

Avez-vous vérifié dans le registre sous …

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Advanced

… pour EnableBalloonTips? Il est très courant que les utilisateurs désactivent.

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 sur la zone cliente du hWnd. Si vous lisez attentivement la documentation de NOTIFYICONDATA vous réaliserez que lorsque l’utilisateur clique sur l’icône, Windows vous envoie un message WM_USER+20 (selon votre code) Paramètre lParam, vous recevrez la notification WM_LBUTTONDOWN .