首先通过创建了系统托盘
//创建系统托盘
nid.cbSize = sizeof(nid);
nid.hWnd = hWnd;
nid.uTimeout = 20000;
nid.uID = 0;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
nid.uCallbackMessage = WM_USER;
nid.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_XEYE));
lstrcpy(nid.szTip, "SysInfor");
Shell_NotifyIcon(NIM_ADD, &nid);然后显示了一个气泡nid.dwInfoFlags = NIIF_INFO;
//复制内容
lstrcpy(nid.szInfo,strTip);
//标题
lstrcpy(nid.szInfoTitle, "SysInfor Tip");
//设置
Shell_NotifyIcon(NIM_MODIFY, &nid);我想接收按下气泡上的那个X的按钮的消息
case WM_USER:
    //关闭气泡提示
    if( lParam == NIN_BALLOONTIMEOUT )
    {
        //标志
        nid.dwInfoFlags = NIIF_NONE;
        //复制内容
        lstrcpy(nid.szInfo,"");
        //标题
        lstrcpy(nid.szInfoTitle, "");
        //设置
        Shell_NotifyIcon(NIM_MODIFY, &nid);
    }
break;但是,再气泡冒出来后,立即就收到了这个消息,即使没按,也会连续收到很多次,这是什么原因呢?

解决方案 »

  1.   

    将消息定义为更大的数值:
    #define WM_TRAYCALLBACK (WM_USER + 500)
      

  2.   

    是说把再改为 nid.uCallbackMessage = WM_TRAYCALLBACK ; ?
    没有效果,还是气泡出来就收到NIN_BALLOONTIMEOUT 
      

  3.   

    收到消息很正常,NotifyIcon有很多事件,显示的时候就会有NIN_BALLOONSHOW事件。
    另外,应该从WM_USER最好也改大一点。
      

  4.   


    怎么查有没有重复?
    我没有主动发WM_USER消息,怎么查是哪里发送的?
      

  5.   


    问题在于重复不断的收到 NIN_BALLOONTIMEOUT 消息。
      

  6.   

    先把WM_USER改一下,例如WM_USER+100。
      

  7.   

    定一个自定义消息 #define WM_MYCALLBACK WM_USER+105
    nid.uCallbackMessage = WM_MYCALLBACK; 
      

  8.   

    #define WM_TRAYCALLBACK (WM_USER + 50000) 
    case WM_CREATE:
    ……
        nid.uCallbackMessage = WM_TRAYCALLBACK;
    ……
    break;
    case WM_TRAYCALLBACK:
        //关闭气泡提示 
        if( lParam == NIN_BALLOONTIMEOUT ) 
        { 
            //标志 
            nid.dwInfoFlags = NIIF_NONE; 
            //复制内容 
            lstrcpy(nid.szInfo,""); 
            //标题 
            lstrcpy(nid.szInfoTitle, ""); 
            //设置 
            Shell_NotifyIcon(NIM_MODIFY, &nid); 
        } 
    break;依然气泡一冒出来就进到判断里面了
      

  9.   

    奇怪的是,气泡的其他消息都正常,比如NIN_BALLOONUSERCLICK就没有一开始就收到,也不会重复收到//关闭气泡提示
    case WM_TRAYCALLBACK: 
        //关闭气泡提示 
        if( lParam == NIN_BALLOONTIMEOUT ) 
        { 
         }   if ( lParam ==  NIN_BALLOONUSERCLICK)
      {
     //标志 
            nid.dwInfoFlags = NIIF_NONE; 
            //复制内容 
            lstrcpy(nid.szInfo,""); 
            //标题 
            lstrcpy(nid.szInfoTitle, ""); 
            //设置 
            Shell_NotifyIcon(NIM_MODIFY, &nid); 
      }
    break;