请教各位大侠,
如何关闭已经弹出的托盘菜单?
多谢!!!!!!

解决方案 »

  1.   

    ::SetForegroundWindow(m_hWnd);
    //弹出菜单
    ::PostMessage(m_hWnd,WM_NULL, 0, 0 );
      

  2.   

    是你自己的程序的吗?
    是的话,在代码中 ::TrackPopupMenu(...); 之前加上::SetForegroundWindow(NOTIFYICONDATA结构体变量.hWnd);这样就可以按下Esc或点击别处菜单就会消失了
      

  3.   

    switch(lParam) 

    case WM_RBUTTONUP:  //右键起来时弹出快捷菜单 
    {   
    LPPOINT lpoint=new tagPOINT; 
    ::GetCursorPos(lpoint);     //得到鼠标位置 
    menu.CreatePopupMenu();     //声明一个弹出式菜单  SetForegroundWindow();      //按任意键隐藏弹出的菜单 //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已 
        //隐藏),将程序结束。 
    menu.AppendMenu(MF_STRING,ID_OPEN,"还原");    //添加了ID_OPEN单击的消息函数OnOpen()
    menu.AppendMenu(MF_STRING,WM_DESTROY,"退出"); //退出命令
    //确定弹出式菜单的位置 
    menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); 
    //资源回收 
      hmenu=menu.Detach(); 
      menu.DestroyMenu(); 
        delete lpoint; 

    break;  case WM_LBUTTONDBLCLK: //双击左键的处理 
    {     
    this->ShowWindow(SW_SHOWNORMAL); //简单的显示主窗口

    break;
      

  4.   

    SetForegroundWindow();      //按任意键隐藏弹出的菜单 
      

  5.   

    lz是不是要通过子菜单关闭弹出式菜单? 下面代码可以的,我上面的回答里很详细的menu.AppendMenu(MF_STRING,WM_DESTROY,"退出");   //退出命令 
      

  6.   

    关闭弹出的菜单:
    ::PostMessage(m_hWnd,WM_CANCELMODE,0,0);
      

  7.   

    先谢谢大家,可能是我没说清楚,
    首先我设置一个定时器开始计时,
    然后手动从程序托盘处右键弹出来一个菜单,
    当定时器时间到了的时候,
    去关闭程序在托盘处的右键菜单但现在的问题就是
    右键菜单是我用别人的类弹出来的,不是自己用windows接口做的
    我可否查找到该菜单的句柄,并destroy它?
      

  8.   


    正常的弹出菜单,不管怎样,必然会调用TrackPopupMenu,也必然会指定一个HWND参数,指定这个菜单属于哪个窗口。你没办法知道菜单属于哪个窗口吗?只要知道这个窗口的HWND,发送WM_CANCELMODE消息就能取消菜单。