Shell_NotifyIcon
DeVincci -- devincci@ix.netcom.com Saturday, December 28, 1996 Environment: MSVC++ 4.0, Windows 95 I have a problem with this call to the Shell_NotifyIcon API function... I pass the hWnd to the function in the NOTIFYICONDATA structure. If I give the handle to a CStatic control with an icon in it, the Icon stays in the taskbar. If I give the hWnd to the my Dialog, the icon disappears from the tray when I put my mouse cursor on the icon in the taskbar tray. The CStatic control has the "Notify" option checked. I created an Appwizard Dialog App and put the call to Shell_NotifyIcon in the OnInitDialog() function. Anyways, for the callback message in the NOTIFYICONDATA structure, where do I capture the message that I specify. Clicking the mouse on the Taskbar icon DOES NOT trigger the WindowProc or DefWindowProc functions...... If someone has some sample code implementing a taskbar icon in an AppWizard created App, I would be very thankful for some sample code.. P.S. The sample that comes with VC++ does NOT use an AppWizard created App...it uses a standard WinMain function approach... Here's my code: NOTIFYICONDATA tnd; myPntr= (CStatic *)GetDlgItem(IDC_STATIC1); myPntr->SetIcon(ExtractIcon(AfxGetInstanceHandle(),"state11.ico",0)); tnd.cbSize = sizeof(NOTIFYICONDATA); tnd.hWnd = myPntr->m_hWnd; tnd.uID = 53; tnd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; tnd.uCallbackMessage = WM_LBUTTONDOWN; tnd.hIcon = myPntr->GetIcon(); strcpy(tnd.szTip, "Hello") ; Shell_NotifyIcon(NIM_ADD, &tnd); Thanks for ANY help!!!!!!!!!!
Mike Morel -- mmorel@mushroomsoft.com Sunday, December 29, 1996 This sample is an App-Wizard app, but not dialog-based. The hWnd that you use must be the one which will receive the notifications (mouse move, click, etc.). So you want the dialog's hWnd. In the sample below, it's the main frame window. This sample is from the December issue of MFC For Yourself. The class is CTrayFrame, derived from CFrameWnd. Using the CTrayFrame class for your main window, your app automatically adds and handles a tray icon: void CTrayFrame::SetTrayIcon(UINT idIcon) { m_hTrayIcon = AfxGetApp()->LoadIcon(m_idIcon); ... error checking... NOTIFYICONDATA nid; nid.cbSize = sizeof(nid); nid.hWnd = m_hWnd; nid.uID = 1; nid.uFlags = NIF_ICON | NIF_MESSAGE; nid.uCallbackMessage = TRAY_MESSAGE; nid.hIcon = m_hTrayIcon; if (! Shell_NotifyIcon(NIM_ADD, &nid)) { TRACE("Shell_NotifyIcon Failed!\n"); return; } m_bIconAdded = TRUE; return; } To handle the messages: BEGIN_MESSAGE_MAP(CTrayFrame, CFrameWnd) //{{AFX_MSG_MAP(CTrayFrame) //}}AFX_MSG_MAP ON_MESSAGE(TRAY_MESSAGE, OnTrayMessage) END_MESSAGE_MAP() LRESULT CTrayFrame::OnTrayMessage(WPARAM wParam, LPARAM lParam) { UINT msg = (UINT)lParam; switch (msg) { case WM_LBUTTONDOWN: ...etc... One other note - if you use a dialog-based app, you'll probably have trouble with the enabling / disabling of menu items of "right-click" popup menus. This is because the normal command UI update mechanism will work with TrackPopupMenu only if the owner window is derived from CFrameWnd, not CDialog. So I used a frame window, and modified its attributes so that it cannot be resized, so that it looks like a dialog, but it really isn't. Hope this helps. You can see more about the CTrayFrame class at our web site. Mike Morel mmorel@mushroomsoft.com Mushroom Software Home of MFC For Yourself http://www.mushroomsoft.com ---------- From: DeVincci[SMTP:devincci@ix.netcom.com] Sent: Saturday, December 28, 1996 1:08 PM To: Send2MFC-L Subject: Shell_NotifyIcon Environment: MSVC++ 4.0, Windows 95 I have a problem with this call to the Shell_NotifyIcon API function... I pass the hWnd to the function in the NOTIFYICONDATA structure. If I give the handle to a CStatic control with an icon in it, the Icon stays in the taskbar. If I give the hWnd to the my Dialog, the icon disappears from the tray when I put my mouse cursor on the icon in the taskbar tray. The CStatic control has the "Notify" option checked. I created an Appwizard Dialog App and put the call to Shell_NotifyIcon in the OnInitDialog() function. Anyways, for the callback message in the NOTIFYICONDATA structure, where do I capture the message that I specify. Clicking the mouse on the Taskbar icon DOES NOT trigger the WindowProc or DefWindowProc functions...... If someone has some sample code implementing a taskbar icon in an AppWizard created App, I would be very thankful for some sample code.. P.S. The sample that comes with VC++ does NOT use an AppWizard created App...it uses a standard WinMain function approach... Here's my code: NOTIFYICONDATA tnd; myPntr= (CStatic *)GetDlgItem(IDC_STATIC1); myPntr->SetIcon(ExtractIcon(AfxGetInstanceHandle(),"state11.ico",0)); tnd.cbSize = sizeof(NOTIFYICONDATA); tnd.hWnd = myPntr->m_hWnd; tnd.uID = 53; tnd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; tnd.uCallbackMessage = WM_LBUTTONDOWN; tnd.hIcon = myPntr->GetIcon(); strcpy(tnd.szTip, "Hello") ; Shell_NotifyIcon(NIM_ADD, &tnd); Thanks for ANY help!!!!!!!!!!
Dana M. Epp -- eppdm@uniserve.com Sunday, December 29, 1996 I have a solution that works for me, however, I do not know if it is the defacto standard. Anyways, if I had to approach this .. I would do it like this.. you can register a callback with the Tray for messages. Most people would want to deal with more than one message.. so set up one callback for all of them. I would approach it like this: // Do this after your defines in you implimentation file UINT MSG_TASKBARCALLBACK = ::RegisterWindowMessage("TaskbarMessage"); // Register the Callback Message // In you Message Map.. add this.. ON_REGISTERED_MESSAGE( MSG_TASKBARCALLBACK, OnTaskbarNotify ) // don't forget to add this to your class: LRESULT OnTaskbarNotify( WPARAM wParam, LPARAM lParam ); Now by simply setting the MSG_TASKBARCALLBACK as the callback.. you have full control over what is going on. NOTIFYICONDATA tnd; myPntr= (CStatic *)GetDlgItem(IDC_STATIC1); myPntr->SetIcon(ExtractIcon(AfxGetInstanceHandle(),"state11.ico",0)); tnd.cbSize = sizeof(NOTIFYICONDATA); tnd.hWnd = myPntr->m_hWnd; tnd.uID = 53; tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; tnd.uCallbackMessage = MSG_TASKBARCALLBACK; tnd.hIcon = myPntr->GetIcon(); strcpy(tnd.szTip, "Hello") ; ::Shell_NotifyIcon(NIM_ADD, &tnd); LRESULT CMainFrame::OnTaskbarNotify( WPARAM, LPARAM lParam ) { switch (lParam) { case WM_LBUTTONDOWN: // You got your Message Callback break; case WM_RBUTTONDOWN: break; // etc etc } return 0; } I know this example shows it in a CMainFrame for clarity.. but you can pretty well put this where you want. The point is.. the callback message will hold in the lParam the message for the tray icon... in this case a WM_LBUTTONDOWN or WM_RBUTTONDOWN. Good luck. At 01:08 PM 12/28/96 -0500, you wrote: >Environment: MSVC++ 4.0, Windows 95 > >I have a problem with this call to the Shell_NotifyIcon API function... > >I pass the hWnd to the function in the NOTIFYICONDATA structure. >If I give the handle to a CStatic control with an icon in it, the Icon >stays in the taskbar. >If I give the hWnd to the my Dialog, the icon disappears from the tray when >I put my mouse >cursor on the icon in the taskbar tray. >The CStatic control has the "Notify" option checked. > >I created an Appwizard Dialog App and put the call to Shell_NotifyIcon in >the OnInitDialog() function. > >Anyways, for the callback message in the NOTIFYICONDATA structure, where do >I capture the message that I specify. > >Clicking the mouse on the Taskbar icon DOES NOT trigger the WindowProc or >DefWindowProc functions...... >If someone has some sample code implementing a taskbar icon in an AppWizard >created App, I would be very thankful for some sample code.. > >P.S. The sample that comes with VC++ does NOT use an AppWizard created >App...it uses a standard WinMain function approach... > >Here's my code: > > NOTIFYICONDATA tnd; > > > myPntr= (CStatic *)GetDlgItem(IDC_STATIC1); > myPntr->SetIcon(ExtractIcon(AfxGetInstanceHandle(),"state11.ico",0)); > > tnd.cbSize = sizeof(NOTIFYICONDATA); > tnd.hWnd = myPntr->m_hWnd; > tnd.uID = 53; > tnd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; > tnd.uCallbackMessage = WM_LBUTTONDOWN; > tnd.hIcon = myPntr->GetIcon(); > strcpy(tnd.szTip, "Hello") ; > > Shell_NotifyIcon(NIM_ADD, &tnd); > > >Thanks for ANY help!!!!!!!!!! > > PC'ing you, Dana M. Epp eppdm@uniserve.com http://bedrock.cyberhq.com/dana "How can one work with the technology of today, using yesterdays software and methods, and still be on the leading edge tomorrow? Why settle for less... I won't! "
Dan Kirby -- dkirby@accessone.com Sunday, December 29, 1996 Hi, you don't need to use RegisterWindowMessage(). Use WM_APP+x. See knowleddgebase article Q86835 for more information about using WM_APP. Also, on a related topic, article Q139408 contains additional information about how to add drag and drop features to the icon in the status area which you may find useful. --dan ---------- > From: Dana M. Epp> To: mfc-l@netcom.com > Cc: devincci@ix.netcom.com > Subject: Re: Shell_NotifyIcon > Date: Sunday, December 29, 1996 11:41 AM > > I have a solution that works for me, however, I do not know if it is the > defacto standard. Anyways, if I had to approach this .. I would do it like > this.. you can register a callback with the Tray for messages. Most people > would want to deal with more than one message.. so set up one callback for > all of them. I would approach it like this: > > > // Do this after your defines in you implimentation file > UINT MSG_TASKBARCALLBACK = > ::RegisterWindowMessage("TaskbarMessage"); // Register the Callback Message > > > // In you Message Map.. add this.. > ON_REGISTERED_MESSAGE( MSG_TASKBARCALLBACK, OnTaskbarNotify ) > // don't forget to add this to your class: > LRESULT OnTaskbarNotify( WPARAM wParam, LPARAM lParam ); > > Now by simply setting the MSG_TASKBARCALLBACK as the callback.. you have > full control over what is going on. > > NOTIFYICONDATA tnd; > > myPntr= (CStatic *)GetDlgItem(IDC_STATIC1); > myPntr->SetIcon(ExtractIcon(AfxGetInstanceHandle(),"state11.ico",0)); > > tnd.cbSize = sizeof(NOTIFYICONDATA); > tnd.hWnd = myPntr->m_hWnd; > tnd.uID = 53; > tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; > tnd.uCallbackMessage = MSG_TASKBARCALLBACK; > tnd.hIcon = myPntr->GetIcon(); > strcpy(tnd.szTip, "Hello") ; > > ::Shell_NotifyIcon(NIM_ADD, &tnd); > > LRESULT CMainFrame::OnTaskbarNotify( WPARAM, LPARAM lParam ) > { > > switch (lParam) > { > case WM_LBUTTONDOWN: > // You got your Message Callback > break; > case WM_RBUTTONDOWN: > break; // etc etc > } > > return 0; > } > > > I know this example shows it in a CMainFrame for clarity.. but you can > pretty well put this where you want. The point is.. the callback message > will hold in the lParam the message for the tray icon... in this case a > WM_LBUTTONDOWN or WM_RBUTTONDOWN. Good luck. > > At 01:08 PM 12/28/96 -0500, you wrote: > >Environment: MSVC++ 4.0, Windows 95 > > > >I have a problem with this call to the Shell_NotifyIcon API function... > > > >I pass the hWnd to the function in the NOTIFYICONDATA structure. > >If I give the handle to a CStatic control with an icon in it, the Icon > >stays in the taskbar. > >If I give the hWnd to the my Dialog, the icon disappears from the tray when > >I put my mouse > >cursor on the icon in the taskbar tray. > >The CStatic control has the "Notify" option checked. > > > >I created an Appwizard Dialog App and put the call to Shell_NotifyIcon in > >the OnInitDialog() function. > > > >Anyways, for the callback message in the NOTIFYICONDATA structure, where do > >I capture the message that I specify. > > > >Clicking the mouse on the Taskbar icon DOES NOT trigger the WindowProc or > >DefWindowProc functions...... > >If someone has some sample code implementing a taskbar icon in an AppWizard > >created App, I would be very thankful for some sample code.. > > > >P.S. The sample that comes with VC++ does NOT use an AppWizard created > >App...it uses a standard WinMain function approach... > > > >Here's my code: > > > > NOTIFYICONDATA tnd; > > > > > > myPntr= (CStatic *)GetDlgItem(IDC_STATIC1); > > myPntr->SetIcon(ExtractIcon(AfxGetInstanceHandle(),"state11.ico",0)); > > > > tnd.cbSize = sizeof(NOTIFYICONDATA); > > tnd.hWnd = myPntr->m_hWnd; > > tnd.uID = 53; > > tnd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; > > tnd.uCallbackMessage = WM_LBUTTONDOWN; > > tnd.hIcon = myPntr->GetIcon(); > > strcpy(tnd.szTip, "Hello") ; > > > > Shell_NotifyIcon(NIM_ADD, &tnd); > > > > > >Thanks for ANY help!!!!!!!!!! > > > > > PC'ing you, > Dana M. Epp > eppdm@uniserve.com > http://bedrock.cyberhq.com/dana > > "How can one work with the technology of today, using yesterdays > software and methods, and still be on the leading edge tomorrow? > Why settle for less... I won't! " >
Mario Contestabile -- Mario_Contestabile.UOS__MTL@UOSMTL2.universal.com Monday, December 30, 1996 >I have a problem with this call to the Shell_NotifyIcon API function... Here's how I do it and it works fine: NOTIFYICONDATA tnib; memset(&tnib, 0, sizeof(NOTIFYICONDATA)); tnib.cbSize = sizeof(NOTIFYICONDATA); tnib.uFlags = NIF_ICON | NIF_TIP; tnib.uID = njobid; CString tip; HICON icon = LoadIcon(IDI_XXX); tnib.hIcon = icon; tip.LoadString(IDS_TIP); // 64 chars max _tcsncpy(tnib.szTip, tip, 62); Shell_NotifyIcon(NIM_ADD, &tnib) mcontest@universal.com
| Вернуться в корень Архива |