使用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);
上网搜了,都照做了,还是希望大家能帮帮忙。
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);
解决方案 »
- 求高手解决,关于 DLL,,关于 vector,关于运行库,关于函数按引用传递参数
- 界面显示求助
- 急!请教静态调用DLL,LIB、DLL与工程文件、执行文件都不在同一个目录,如何调用??
- 如何制作安装包。
- 编译通过,却不能运行是什么原因?
- 有谁知道“虚拟硬盘”的原理?
- 怎么将一个文件类型与一个exe关联起来
- 我用多线程分别进行各自的GDI操作,但是Win98和WinXP下却不同的,麻烦各位进来看看,我非常着急啊!!!!!!!!!
- vc中是否有现成的B tree的数据结构
- 关于 VC 对话框的初始化问题
- 求助:点击一个按钮,关闭一个线程,获得线程值才继续执行,怎么办?
- 关于获取电子条码秤数据的问题
Shell_NotifyIcon调用两次,第二次参数用NIM_MODIFY
Shell_NotifyIcon(NIM_MODIFY, &nid);
#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");
#define _WIN32_IE 0x500
/**
* @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);
}
}
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);
等等
恳请大家不吝赐教若能测试一下我的代码,则更是感激不尽
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;
}
气球还是弹不出来
我都把XP SP2 升到 SP3了
再等等,准备结贴谢谢各位。
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);