使用Shell_NotifyIcon()函数,想在托盘图标上弹出气球提示。一直无法成功。
上网搜了,都照做了,还是希望大家能帮帮忙。
windows XP SP2 + VS2008。
_WIN32_IE 是 0x0700    ZeroMemory(&nid, sizeof(NOTIFYICONDATA_V3_SIZE));     nid.uVersion = NOTIFYICON_VERSION;
    nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA_V3_SIZE);
    nid.hWnd=this->m_hWnd;  
    nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));  
    nid.uID=IDR_MAINFRAME;  
    nid.uFlags= NIF_MESSAGE|NIF_ICON|NIF_TIP|NIF_INFO;  
    nid.dwState = NIS_SHAREDICON;
    nid.dwStateMask = NIS_SHAREDICON;
    nid.uCallbackMessage=WM_SHOWTASK;
    wcscpy_s(nid.szTip,_T("XXXXXXX"));
    wcscpy_s(nid.szInfo,_T("XX"));  
    wcscpy_s(nid.szInfoTitle,_T("XXXX"));  
    nid.dwInfoFlags=NIIF_INFO;  
    nid.uTimeout=5000;          //在托盘区添加图标
    Shell_NotifyIcon(NIM_ADD,&nid);  

解决方案 »

  1.   

    应该是两个过程,先创建托盘图标,然后显示气泡提示
    Shell_NotifyIcon调用两次,第二次参数用NIM_MODIFY
      

  2.   

    添加Shell_NotifyIcon(NIM_MODIFY,&nid); 
      

  3.   

    要显示气泡的地方
    Shell_NotifyIcon(NIM_MODIFY, &nid);
      

  4.   

    给你封装好的源码,新建一个头文件把它粘贴进去然后include到工程里#pragma once
    #include <tchar.h>#ifndef ASSERT
    #include <assert.h>
    #define ASSERT assert
    #endifstruct MessageBalloon : public NOTIFYICONDATA
    {
    MessageBalloon(LPCTSTR _szInfo = _T("Prompt"), LPCTSTR _szInfoTitle = 0, LPCTSTR _szTip = 0, HICON _hIcon = 0)
    {
    ASSERT(_szInfo);
    static struct wnd_holder{
    HWND hwnd_;
    wnd_holder(){hwnd_ = CreateWindowW(L"STATIC", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);}
    ~wnd_holder(){DestroyWindow(hwnd_);}
    } wh;

    memset(this, 0, sizeof(*this));
    cbSize = sizeof(*this);
    hWnd = wh.hwnd_;
    hIcon = _hIcon ? _hIcon : ::LoadIcon(::GetModuleHandle(NULL),MAKEINTRESOURCE(128/*IDR_MAINFRAME*/));
    if (! hIcon) hIcon = ::LoadIcon(NULL, IDI_INFORMATION);
    /*if (! hIcon) hIcon = ::LoadIcon(NULL, "butterfly.ico");*/
    // if 'NIF_INFO' is an undeclared identifier, define _WIN32_IE 0x500 at the very beginning
    uFlags = NIF_INFO | NIF_TIP | NIF_ICON; 
    dwInfoFlags = NIIF_INFO;
    _tcscpy(szInfo, _szInfo);
    if (! _szInfoTitle) LoadString(::GetModuleHandle(NULL), 57344/*AFX_IDS_APP_TITLE*/, szInfoTitle, sizeof(szInfoTitle));
    else _tcscpy(szInfoTitle, _szInfoTitle);
    _tcscpy(szTip, _szTip ? _szTip : szInfoTitle); Shell_NotifyIcon(NIM_ADD, this);
    }

    ~MessageBalloon(){Shell_NotifyIcon(NIM_DELETE, this);}
    };调用方法是
    MessageBalloon mb("你好", "MsgBalloon Demo");
      

  5.   

    差点忘了还要在使用前
    #define _WIN32_IE 0x500
      

  6.   

    VS2008+SP1中的提示样式很多,不妨参考一下
      

  7.   


    /** 
    * @summary 气球显示
    * @param szMsg [in] 显示的信息内容
    * @param szTitle [in] 显示的信息标题
    * @param uTimeout [in] 超时时间(毫秒)
    * @param dwInfoFlags [in] 参数 说明如下
    //NIN_BALLOONSHOW显示
    //NIN_BALLOONHIDE隐藏
    //NIN_BALLOONTIMEOUT超时或者用户关闭才消失
    //NIN_BALLOONUSERCLICK单击才显示
    * @return true 修改托盘成功
    * @return false 修改托盘失败
    **/
    BOOL CXXXXXXDlg::ShowBalloonTip(LPCTSTR szMsg, LPCTSTR szTitle, UINT uTimeout, DWORD dwInfoFlags)
    {
    m_nid.cbSize=sizeof(NOTIFYICONDATA);
    m_nid.uFlags = NIF_INFO;
    m_nid.uTimeout = uTimeout;
    m_nid.dwInfoFlags = dwInfoFlags;
    wcscpy_s(m_nid.szInfo,szMsg ? szMsg : _T(""));
    wcscpy_s(m_nid.szInfoTitle,szTitle ? szTitle : _T(""));
    return Shell_NotifyIcon(NIM_MODIFY, &m_nid);
    }
    使用的时候,调用这个接口就可以了,比如程序最小化到系统托盘时,提示用户自己已最小化到托盘:void CXXXXXXDlg::OnSize(UINT nType, int cx, int cy)
    {
    CDialog::OnSize(nType, cx, cy);
    if(nType == SIZE_MINIMIZED)
    {  
    ShowWindow(SW_HIDE);
    m_nid.cbSize  = (DWORD)sizeof(NOTIFYICONDATA);
    m_nid.hWnd    = this->m_hWnd;
    m_nid.uID     = IDR_MAINFRAME;
    m_nid.uFlags  = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
    m_nid.uCallbackMessage = WM_ICONNOTIFY; // 自定义的消息名称
    m_nid.hIcon   = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
    wcscpy_s(m_nid.szTip, _T("VStar文件下载工具")); // 信息提示条
    Shell_NotifyIcon(NIM_ADD, &m_nid); // 在托盘区添加图标
    ShowBalloonTip(_T("最小到托盘区域!"), _T("XXX工具"), 1000, NIN_BALLOONTIMEOUT);

    }
      

  8.   

    http://www.codeproject.com/KB/dialog/MessageBalloon.aspx
      

  9.   

    谢谢楼上各位的帮助,还是不行呐,
    Shell_NotifyIcon(NIM_MODIFY,&nid);
    调用了还是不行。
    几位兄弟给出的代码也测试了
    我感觉是不是跟机器有关呐?
    希望大家能针对本人的情况和代码对症下药,救人于水火之中。windows XP SP2 + VS2008。
    _WIN32_IE 是 0x0700
    nid 是类的一个私有成员,气球的代码是在InitDialog函数中。BOOL CBalloonTipDlg::OnInitDialog()
    {
        //对对话框字体,颜色的一些修改
        //对注册表的一些查询    nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
        nid.hWnd=this->m_hWnd;  
        nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));  
        nid.uID=IDR_MAINFRAME;  
        nid.uFlags= NIF_MESSAGE|NIF_ICON|NIF_TIP|NIF_INFO;  
        nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称,注意:这里的消息是用户自定义消息  
        wcscpy_s(nid.szTip,_T("XXXXXXXX"));//信息提示条 
        wcscpy_s(nid.szInfo,_T("XX"));  
        wcscpy_s(nid.szInfoTitle,_T("XXXXX"));  
        nid.dwInfoFlags=NIIF_INFO;  
        nid.uTimeout=5000;          //在托盘区添加图标
        Shell_NotifyIcon(NIM_ADD,&nid);  
        Shell_NotifyIcon(NIM_MODIFY,&nid);
        return TRUE;
    }是否ADD与MODIFY应该分开调用,并且MODIFY前要做一些修改?
    还有在XP下,是否该
    nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA_V3_SIZE);
    等等
    恳请大家不吝赐教若能测试一下我的代码,则更是感激不尽
      

  10.   


    BOOL CBalloonTipDlg::OnInitDialog()
    {
        //对对话框字体,颜色的一些修改
        //对注册表的一些查询    nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
        nid.hWnd=this->m_hWnd;  
        nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));  
        nid.uID=IDR_MAINFRAME;  
        nid.uFlags= NIF_MESSAGE|NIF_ICON|NIF_TIP|NIF_INFO;  
        nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称,注意:这里的消息是用户自定义消息  
        wcscpy_s(nid.szTip,_T("XXXXXXXX"));//信息提示条 
        wcscpy_s(nid.szInfoTitle,_T("XXXXX"));  
        nid.dwInfoFlags=NIIF_INFO;  
        nid.uTimeout=5000;          //在托盘区添加图标
        Shell_NotifyIcon(NIM_ADD,&nid);  
        nid.uFlags = NIF_INFO;
        wcscpy_s(nid.szInfo,_T("XX"));  
        Shell_NotifyIcon(NIM_MODIFY,&nid);
        return TRUE;
    }
      

  11.   

    谢谢这位哥们帮我测试了
    气球还是弹不出来
    我都把XP SP2 升到 SP3了
    再等等,准备结贴谢谢各位。
      

  12.   

    改为如下://先添加托盘图标
    Shell_NotifyIcon(NIM_ADD,&nid);  
    //再修改托盘
    nid.cbSize=sizeof(NOTIFYICONDATA);
    nid.uFlags = NIF_INFO;
    nid.uTimeout = 5000;
    nid.dwInfoFlags = NIIF_INFO;
    wcscpy_s(nid.szInfo,szMsg ? szMsg : _T(""));
    wcscpy_s(nid.szInfoTitle,szTitle ? szTitle : _T(""));Shell_NotifyIcon(NIM_MODIFY,&nid);