导航
  • 主页
  • VC综合技术
  • MFC新技术
  • 互联网技术
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC++技术资源

请问托盘图标如何弹出气球提示?

acdbxzyw 2010-07-28 11:28:11
使用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);
...全文
636 点赞 收藏 19
写回复
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
afei8856 2012-06-14
明天回去试试 对这块不懂
回复
gradual 2010-07-29
[Quote=引用 15 楼 gradual 的回复:]
C/C++ code

BOOL CBalloonTipDlg::OnInitDialog()
{
//对对话框字体,颜色的一些修改
//对注册表的一些查询

nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd=this->m_hWnd;
nid.hIcon=LoadIcon(Afx……
[/Quote]

试过了,没问题,程序退出的时候记得销毁托盘
回复
gradual 2010-07-29

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;
}

回复
xiongpursuit 2010-07-29
改为如下:

//先添加托盘图标
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);
回复
jyh_baoding 2010-07-29
以前在网上见过这样的代码,自己找找试试
回复
acdbxzyw 2010-07-29
谢谢楼上各位的帮助,还是不行呐,
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);

等等。。。
恳请大家不吝赐教。。。若能测试一下我的代码,则更是感激不尽。。。
回复
acdbxzyw 2010-07-29
[Quote=引用 16 楼 gradual 的回复:]
试过了,没问题,程序退出的时候记得销毁托盘

[/Quote]
谢谢这位哥们帮我测试了。。。
气球还是弹不出来。。。
我都把XP SP2 升到 SP3了。。。
再等等,准备结贴谢谢各位。
回复
fishion 2010-07-28
http://www.codeproject.com/KB/dialog/MessageBalloon.aspx
回复
Simao 2010-07-28
这个貌似网上有很多例子呢,楼主想做什么样子的...
回复
xingpacer 2010-07-28

/**
* @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);
}
}

回复
Eleven 2010-07-28
VS2008+SP1中的提示样式很多,不妨参考一下
回复
luodx1021 2010-07-28
顶,接分[Quote=引用 6 楼 hankcs 的回复:]
给你封装好的源码,新建一个头文件把它粘贴进去然后include到工程里

C/C++ code

#pragma once
#include <tchar.h>

#ifndef ASSERT
#include <assert.h>
#define ASSERT assert
#endif

struct MessageBalloon : public NOTIFYICON……
[/Quote]
回复
hankcs 2010-07-28
差点忘了还要在使用前
#define _WIN32_IE 0x500
回复
hankcs 2010-07-28
给你封装好的源码,新建一个头文件把它粘贴进去然后include到工程里

#pragma once
#include <tchar.h>

#ifndef ASSERT
#include <assert.h>
#define ASSERT assert
#endif

struct 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");
回复
踏实每一步 2010-07-28
[Quote=引用 1 楼 gradual 的回复:]
应该是两个过程,先创建托盘图标,然后显示气泡提示
Shell_NotifyIcon调用两次,第二次参数用NIM_MODIFY
[/Quote]

就这个
回复
stonewater 2010-07-28
要显示气泡的地方
Shell_NotifyIcon(NIM_MODIFY, &nid);
回复
没用过,帮顶!
回复
hongya6088 2010-07-28
添加

Shell_NotifyIcon(NIM_MODIFY,&nid);
回复
gradual 2010-07-28
应该是两个过程,先创建托盘图标,然后显示气泡提示
Shell_NotifyIcon调用两次,第二次参数用NIM_MODIFY
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……