Placeholder Image

ADN Informatique

Consultant Ingénierie Informatique

Saguenay (Jonquière), Québec, Canada. Tél: (581) 683-9887 Téléc: (581) 221-0874

Placeholder Picture

Retour

Windows tray application

2005-05-30 20:24:21 (ID: 61, Parent: 0, Type: post)
<h3>Voici un exemple de code pour mettre un programme dans le system tray (à coté de l'heure) dans windows.</h3> <br> Il est basé sur un programme en mode dialog.<br> <br> Pour commencer dans le <b>'initinstance'</b> modifier la création de la dialogue de la manière suivante: <pre style="background-color: #FFF8ED">   //int nResponse = dlg.DoModal();    dlg.Create(IDD_AUDIOCONTEXT_DIALOG);   dlg.ShowWindow(SW_HIDE);   int nResponse = dlg.RunModalLoop();   dlg.DestroyWindow(); </pre>  Par la suite modifier la classe de la dialog des manières suivantes:  Ajouter une définition <pre style="background-color: #FFF8ED"> #define MYWM_NOTIFYICON (WM_USER+2) </pre>  A la fin du <b>OnInitDialog(...)</b> <pre style="background-color: #FFF8ED">   TrayMessage(NIM_ADD);   ShowWindow(SW_HIDE); </pre>  A la fin du <b>DestroyWindows(...)</b> <pre style="background-color: #FFF8ED">   TrayMessage(NIM_DELETE); </pre>  Ajouter la fonction suivante: <pre style="background-color: #FFF8ED"> ///////////////////////////////////////////////////////////////////////////// // Supported message // NIM_ADD, NIM_DELETE, NIM_MODIFY BOOL CAudioContextDlg::TrayMessage( DWORD dwMessage, unsigned int icone/*=IDR_TRAYICON*/) {   CString sTip(_T("AudioContext"));   NOTIFYICONDATA tnd;   tnd.cbSize = sizeof(NOTIFYICONDATA);   tnd.hWnd = m_hWnd;   tnd.uID = IDR_TRAYICON;   tnd.uFlags = NIF_MESSAGE|NIF_ICON;   tnd.uCallbackMessage = MYWM_NOTIFYICON;   tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;   VERIFY( tnd.hIcon = LoadIcon(AfxGetInstanceHandle(), 				MAKEINTRESOURCE (icone)) );   lstrcpyn(tnd.szTip, (LPCTSTR)sTip, sizeof(tnd.szTip));    return Shell_NotifyIcon(dwMessage, &tnd); } </pre>  Créer dans les ressources du projet une icone nommée IDR_TRAYICON  vous pouvez aussi créer un menu avec un sous menu qui sera appellé par l'icone avec le bouton de droite, il suffit de créer le menu dans les ressources et d'ajouter ce code <pre style="background-color: #FFF8ED"> ///////////////////////////////////////////////////////////////////////////// void CAudioContextDlg::TrayMenu(void) {     BOOL    bResult = FALSE;     DWORD   SelectionMade;      CMenu menu;      CString csMessage;       int nIndex = 0;          long nRecordNumber = 0;     long nAbsolutePosition = 0;      bResult = menu.LoadMenu(IDR_MENU_POPUP);              CMenu* popup = menu.GetSubMenu(0);                      // menuRtClick.EnableMenuItem(ID_ITEM0, TRUE);     // menuRtClick.EnableMenuItem(ID_ITEM1, TRUE);     // menuRtClick.EnableMenuItem(ID_ITEM2, TRUE);                   // call the helper function to setup this as a titled popup menu     // AddMenuTitle(popup);                       POINT pp;                      GetCursorPos(&pp); 	SetForegroundWindow();     SelectionMade = popup->TrackPopupMenu(                            TPM_LEFTALIGN |                             TPM_LEFTBUTTON |                             TPM_RIGHTBUTTON |                             TPM_NONOTIFY |                             TPM_RETURNCMD,                            pp.x,pp.y,this);              popup->DestroyMenu();              // The value of SelectionMade is the id of the command selected or 0 if no      // selection was made              switch(SelectionMade)     {         case ID_POPUP_QUIT: 		OnOK();         break;         case ID_POPUP_SHOW: 		ShowWindow(SW_NORMAL); 		SetForegroundWindow(); 		SetFocus();         break; 	case ID_POPUP_CONTEXT: 		OnQuery() ; 	break;         case ID_POPUP_ENVOYER: 		OnSend();         break;     } } </pre>  Pour gérer tout ça, il faut égallement ajouter un bout de code dans la fonction DefWinProc(...) <pre style="background-color: #FFF8ED"> case MYWM_NOTIFYICON: { 	switch (lParam) 	{ 		case WM_LBUTTONDOWN: 			{ 				if (::MessageBox(NULL,"Voulez-vous transmettre cette dictée?","Transmettre",MB_YESNO)==IDYES) 				{ 					OnSend(); 				} 				return TRUE; 			} 		case WM_LBUTTONDBLCLK: 			switch (wParam)  			{ 				case IDR_TRAYICON_PA: 					ShowWindow(SW_NORMAL); 					SetForegroundWindow(); 					SetFocus(); 				return TRUE; 				break; 			} 		case WM_RBUTTONDOWN: 			switch (wParam)  			{ 				case IDR_TRAYICON_PA:                                					//Beep(1000,100);  					TrayMenu();  				break; 			} 		break; 	} } break; </pre>  Le code de ce programme est basé sur la fonction shell_notifyicon dont la documentation est disponible à  <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shell_notifyicon.asp">Documentation</a> <br> <br> La majorité du code de cet exemple provient de <a href="http://www.codeguru.com/Cpp/controls/controls/systemtray/article.php/c5309/">Code Guru</a> et de  <a href="http://www.codeproject.com/shell/mfcstartup.asp">Code Project</a> 

Document Informatif

ADN Informatique

2015

Rev. 1

Jean-Luc Cyr