il y a différentes étapes pour faire ceci, c'est assez chaud et rigoureux :
1 - créer un message personnalisé : définir un message perso au début de ton prog, du style
#define WM_TRAYMESSAGE (WM_USER + 101)
2 - lors de l'appel à Shell_NotifyIcon, initialiser le champ uCallbackMessage de la structure NOTIFYICONDATA avec ce message :
m_ni.uCallbackMessage = WM_TRAYMESSAGE;
m_ni est une structure NOTIFYICONDATA
3 - créer un gestionnaire d'évènements pour ce message, par le ClassWizard de VC++. par exemple, pour faire apparaitre un menu sous la souris :
LRESULT CTestDlg::OnTrayMessage(WPARAM wParam, LPARAM lParam)
{
// Bouton droit -> on affiche le menu
// Double clic -> on affiche la fenêtre
CMenu menu;
CPoint pt;
if (lParam == WM_RBUTTONDOWN) { // bouton droit
menu.LoadMenu(IDR_MENU1);
CMenu *m = menu.GetSubMenu(0);
GetCursorPos(&pt);
m->SetDefaultItem(0, TRUE);
::SetForegroundWindow(m_hWnd);
m->TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
pt.x,
pt.y,
this);
::PostMessage(m_hWnd, WM_NULL, 0, 0);
} else if (lParam == WM_LBUTTONDBLCLK) { // double clic
ShowWindow(SW_SHOWNORMAL);
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
SetActiveWindow();
}
return 0;
}
Absolument rien de compliqué dans cette fonction, voir le MSDN si tu ne comprends pas certains trucs.
Cette fonction doit toujours retourner LRESULT, car il s'agit d'un callback
Pour une explication plus détaillée, cf MSDN
A+