Prev: optimization
Next: Lost Mail
From: David Ching on 17 Mar 2010 17:05 FWIW, I couldn't find anything wrong with your code. It looks fine. You might want to try PostMessage(WM_CLOSE) instead. Does it still fail if the dialog is visible? Thanks, David "dushkin" <taltene(a)gmail.com> wrote in message news:078a3b75-73a1-42b2-b265-031daa2239db(a)f8g2000yqn.googlegroups.com... > Hi all. > > I have two questions regarding a very simple tray application. The > application does nothing. It only appears in the system tray. I want > to add a floating menu to it with a "close" menu item that will close > the process. The application is an MFC dialog based application. I > work with VS2008. > > My questions are: > > 1. I added a message handler to the "close" menu item. The handler is > called only after I first r-clicking the app icon, select the "close" > item and again r-clicking the app icon in the tray. Why? > > 2. Then, I put SendMessage(WM_CLOSE) in the handler. The application > was not closed. Why? > > The code is as follows: > > //----------------------------------------------------------------- > cpp file > //----------------------------------------------------------------- > > BEGIN_MESSAGE_MAP(CVPGAgentDlg, CDialog) > ON_WM_SYSCOMMAND() > ON_WM_PAINT() > ON_WM_QUERYDRAGICON() > ON_MESSAGE(MYWM_NOTIFYICON,onTrayNotify) > //}}AFX_MSG_MAP > ON_WM_DESTROY() > ON_WM_CLOSE() > ON_COMMAND(ID_AGENTMENU_CLOSE, OnAgentClose) > END_MESSAGE_MAP() > > void CVPGAgentDlg::SetSysTrayIcon(void) > { > HICON m_hicon = ::LoadIcon(AfxGetInstanceHandle(), > MAKEINTRESOURCE(IDI_SYSTRAYICON)); > > CString sTip(_T("PA Agent")); > > m_pnId.cbSize = sizeof(NOTIFYICONDATA); > m_pnId.hWnd = this->GetSafeHwnd(); > m_pnId.uID = IDI_SYSTRAYICON; > //ICON RESOURCE ID > m_pnId.uFlags = NIF_MESSAGE|NIF_ICON; > m_pnId.uCallbackMessage = MYWM_NOTIFYICON; > m_pnId.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP; > m_pnId.hIcon = m_hicon; > //ICON RESOURCE ID > lstrcpyn(m_pnId.szTip, (LPCTSTR)sTip, sizeof(m_pnId.szTip)); > > DWORD dwMessage = NIM_ADD; > Shell_NotifyIcon(dwMessage, &m_pnId); > > m_TrayMenu.LoadMenu(IDR_MENU1); > } > > LRESULT CVPGAgentDlg::onTrayNotify(WPARAM wParam,LPARAM lParam) > { > UINT uMsg = (UINT) lParam; > switch (uMsg ) > { > case WM_LBUTTONDBLCLK: > this->ShowWindow(SW_SHOW); > break; > case WM_RBUTTONUP: > CPoint pt; > GetCursorPos(&pt); > > SetForegroundWindow(); > m_TrayMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTALIGN| > TPM_LEFTBUTTON|TPM_RIGHTBUTTON,pt.x,pt.y,this); > PostMessage(WM_NULL, 0, 0); > > break; > } > return TRUE; > } > > void CVPGAgentDlg::OnAgentClose() > { > AfxMessageBox("a"); > //SendMessage(WM_CLOSE); > } > > void CVPGAgentDlg::OnDestroy() > { > Shell_NotifyIcon(NIM_DELETE,&m_pnId); > CDialog::OnDestroy(); > > // TODO: Add your message handler code here > } > > > //----------------------------------------------------------------- > h file: > //----------------------------------------------------------------- > #define MYWM_NOTIFYICON (WM_USER+1) > > CMenu m_TrayMenu; > NOTIFYICONDATA m_pnId; > > void SetSysTrayIcon(void); > > afx_msg LRESULT onTrayNotify(WPARAM, LPARAM); > afx_msg void OnAgentClose(); > afx_msg void OnClose(); > afx_msg void OnDestroy(); > > > > > THANKS! > >
From: dushkin on 18 Mar 2010 05:03
On Mar 17, 8:55 pm, "Tom Serface" <t...(a)camaswood.com> wrote: > PJ has had this for a while, but the technology hasn't changed much in the > last years so it still works really well. Worth a look anyway. > > Tm > > "dushkin" <talt...(a)gmail.com> wrote in message > > news:81012ed3-aa95-4c27-b2ac-846c742f8324(a)g11g2000yqe.googlegroups.com... > > > > > Seems to be great! I will check it. Thanks! > > Did you really maintained this package 11 years?!?! > > :-) Tom, I used your classes. Same results. Here are the relevant code sections: CTrayNotifyIcon g_TrayIcon1; BEGIN_MESSAGE_MAP(CVPGAgentDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_WM_DESTROY() ON_WM_CLOSE() ON_COMMAND(ID_AGENTMENU_CLOSE, OnAgentClose) ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotification) END_MESSAGE_MAP() void CVPGAgentDlg::OnAgentClose() { //AfxMessageBox("a"); PostMessage(WM_CLOSE); } void CVPGAgentDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here m_autoLog.Close(); } int CVPGAgentDlg::CreateTrayIcon(void) { if (!g_TrayIcon1.Create(this, IDR_MENU1, _T("PA Automation Agent"), m_hIcons[0], WM_TRAYNOTIFY)) { AfxMessageBox(_T("Failed to create tray icon"), MB_OK | MB_ICONSTOP); return -1; } //For testing purposes, change the default menu item on the first icon to be the bottom item on the context menu g_TrayIcon1.SetDefaultMenuItem(ID_APP_ABOUT, FALSE); return 0; } LRESULT CVPGAgentDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam) { //Delegate all the work back to the default implementation in //CTrayNotifyIcon. g_TrayIcon1.OnTrayNotification(wParam, lParam); return 0L; } |