最小化到托盘的对话框,想让它显示出来,用
SendMessage(Hwin,WM_ACTIVATEAPP,NULL,NULL);就是显示不出来,是消息错了么??

解决方案 »

  1.   

    此时你的窗口其实是被隐藏了,所以要再显示出来:this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿下面是写好的恢复界面函数
        在头文件中定义消息响应函数afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
     LRESULT CMyDlg::OnShowTask(WPARAM wParam,LPARAM lParam)
     {
         if(wParam!=IDR_MAINFRAME)
             return 1;
         switch(lParam)
         {
                case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
                    LPPOINT lpoint=new tagPOINT;
                    ::GetCursorPos(lpoint);//得到鼠标位置
                    CMenu menu;
                    menu.CreatePopupMenu();//声明一个弹出式菜单
           //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已隐藏),将程序结束。
                    menu.AppendMenu(MF_STRING,WM_DESTROY,L"关闭");
           //确定弹出式菜单的位置
                    menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
                    HMENU hmenu=menu.Detach();//资源回收
                    menu.DestroyMenu();
                    delete lpoint;
                    break;
               case WM_LBUTTONDBLCLK://双击左键的处理
                     this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿
                     DeleteTray();
                     break; 
               default: 
                     break;
         }
         return 0;
     } 
      

  2.   

    再附送一个删除托盘图标函数
    void CMyDlg::DeleteTray()

        NOTIFYICONDATA nid;
        nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
        nid.hWnd=this->m_hWnd;
        nid.uID=IDR_MAINFRAME;
        nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
        nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
        nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
        wcscpy(nid.szTip,L"程序名称");    //信息提示条
        Shell_NotifyIcon(NIM_DELETE,&nid);    //在托盘区删除图标
    }
      

  3.   

    WM_ACTIVATEAPP好像是把不活动窗口激活,不包括图标
    用SendMessage(Hwin,WM_SHOWWINDOW,TRUE,NULL);试试
      

  4.   

    补齐吧:
    程序实现
    1、自定义消息WM_SHOWTASK: #define WM_SHOWTASK (WM_USER +1)
    2、在MFC的::OnSysCommand(UINT nID, LPARAM lParam)函数体中增加一个命令响应
            if(nID==SC_MINIMIZE)    ToTray(); //最小化到托盘的函数
    3、在消息映射中添加 ON_MESSAGE(WM_SHOWTASK,OnShowTask),其中WM_SHOWTASK是消息名,
    OnShowTask是自己定义的消息响应函数,后面有说明。
    四、具体函数内容
    1、最小化到托盘函数
    void CMyDlg::ToTray(){
        NOTIFYICONDATA nid;
         nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
         nid.hWnd=this->m_hWnd;
         nid.uID=IDR_MAINFRAME;
         nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
         nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
         nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
         wcscpy(nid.szTip,L"程序名称");    //信息提示条
         Shell_NotifyIcon(NIM_ADD,&nid);    //在托盘区添加图标
         ShowWindow(SW_HIDE);    //隐藏主窗口
    }
      

  5.   

    可以用FindWindow 之类的找到对应窗体的句柄,或者枚举进程 找到这个这个窗口句柄Hwin然后用SendMessage(Hwin,WM_SHOWWINDOW,TRUE,NULL);试试
      

  6.   

    响应WM_SIZE消息,判断nType==SIZE_MINIMIZED时,用ShowWindow(SW_HIDE)将窗口隐藏;当要还原时,先用ShowWindow(SW_SHOW)显示窗口,再用ShowWindow(SW_RESTORE)还原窗口。
      

  7.   

    这个窗口没有最小化那个按钮,也不相应!,是不是就直接ShowWindow(Hwin,SW_SHOW);ShowWindow(Hwin,SW_RESTORE);
      

  8.   

    ::ShowWindow(Hwin,SW_SHOW);
    ::ShowWindow(Hwin,SW_RESTORE);
      

  9.   

    那就是直接用ShowWindow(Hwin,SW_HIDE)隐藏,ShowWindow(Hwin,SW_SHOW)显示,不需要最小化了。