我用如下代码在windows的任务栏中添加了图标
m_popMenu.LoadMenu( IDR_POPUPMENU ); m_nid.cbSize = sizeof( m_nid );
m_nid.hIcon = ::LoadIcon( AfxGetInstanceHandle(), MAKEINTRESOURCE( IDR_ELFEYE_OFF ) );
m_nid.hWnd = GetSafeHwnd();
m_nid.uCallbackMessage = TASKBAR_ICON_NOTIFY;
m_nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE; 
m_nid.uID = IDR_MAINFRAME;
strcpy( m_nid.szTip, "ElfEye精灵眼" ); Shell_NotifyIcon( NIM_ADD, &m_nid );并且用如下代码响应用户对任务栏的图标右击事件:
if( IDR_MAINFRAME == uID && WM_RBUTTONUP == lEvent )
{
CPoint mousePt;
GetCursorPos( &mousePt ); CMenu* pSubMenu = m_popMenu.GetSubMenu( 0 );
pSubMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
mousePt.x, mousePt.y, this );
} return TRUE;但是如何在右击任务栏图标, 显示了菜单之后, 响应用户对菜单外区域的鼠标点击事件?
因为一般来说, 用户点击了非菜单区域, 应该自动关闭该菜单.

解决方案 »

  1.   

    在TrackPopupMenu之前,对主窗口使用SetForegroundWindow:
    if( IDR_MAINFRAME == uID && WM_RBUTTONUP == lEvent )
    {
    CPoint mousePt;
    GetCursorPos( &mousePt ); CMenu* pSubMenu = m_popMenu.GetSubMenu( 0 );
    SetForegroundWindow();
    pSubMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
    mousePt.x, mousePt.y, this );
    } return TRUE;
      

  2.   

    你需要用SetForegroundWindow()显示并跟踪菜单