怎样取消一个弹出式菜单
 
我有一个应用程序不显示窗口(建立窗口时使用了SW_HIDE参数),它只在任务条显示一个图标,我是这样做的:
        NOTIFYICONDATA tnid;
        tnid.cbSize = sizeof(NOTIFYICONDATA);
        tnid.hWnd = m_hWnd;
        tnid.uID = 1;
        tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
        tnid.uCallbackMessage = MYWM_NOTIFYICON;
        tnid.hIcon = AfxGetApp()->LoadIcon( IDI_ICON1 );
        lstrcpyn(tnid.szTip, "Giroimag Image Mail Exchange", strlen("Giroimag Image Mail Exchange")+1);
        Shell_NotifyIcon(NIM_ADD, &tnid);
  当我点击任务条时,程序会显示一个弹出菜单:
        CMenu m_Menu;
        m_Menu.CreatePopupMenu();
        m_Menu.AppendMenu( MF_STRING, IDM_ABOUT, "Op&1" );
        m_Menu.AppendMenu( MF_SEPARATOR, 0 );
        m_Menu.AppendMenu( MF_STRING, IDM_CONFIG, "Op&2" );
        m_Menu.AppendMenu( MF_STRING, IDM_STATUS, ""Op&3" );
        m_Menu.AppendMenu( MF_SEPARATOR, 0 );
        m_Menu.AppendMenu( MF_STRING, IDM_SEND, "Op&4" );
        m_Menu.AppendMenu( MF_STRING, IDM_RECEIVE, "Op&5" );
        m_Menu.AppendMenu( MF_SEPARATOR, 0 );
        m_Menu.AppendMenu( MF_STRING, IDM_CLOSE, "Op&6" );
        POINT p;
        GetCursorPos( & p );
        m_Menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, this );
  到这为止,程序运行很正常,问题在于如果我不选择任何菜单该怎样取消它?我以为按ESC或者在菜单外面点击就可以取消,但事实并不是这样。我也试过用WIN32API中的TrackPopupMenuEx函数但没有用,到底我该怎么做?
1)最简单的方法在消息映象中加"Cancel Menu"命令即可。
2)尽管你的主窗口不可见,但在你可以在调用m_Menu.TrackPopupMenu();时将其置为最前。
3)在你弹出菜单之前,设置你的窗口为最前窗口,调用下面的代码,问题就会迎刃而解。
POINT p;
GetCursorPos( & p );
// Increase the thread priority by invoking SetForegroundWindow.
SetForegroundWindow();
m_Menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, this );
  4)调用TrackPopupMenu()之前,你必须先调用SetForegroundWindow( m_hWnd ),然后调用PostMessage( m_hWnd, WM_NULL, 0, 0 ):
         POINT point;
         GetCursorPos( &point );
         SetForegroundWindow( m_hWnd );
         TrackPopupMenu( hPopup,
            TPM_RIGHTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
            point.x,
            point.y,
            0,
            m_hWnd, 0 );
         PostMessage( m_hWnd, WM_NULL, 0, 0 );