关于系统托盘的消息显示。

na2650945 2011-03-21 02:40:07
想在系统托盘上做个消息显示。
调用的是别人的做的CSystemTray。
应该是网上比较通用的系统托盘开源库了。
显示消息是这个函数吧。

BOOL CSystemTray::ShowBalloon(LPCTSTR szText,
LPCTSTR szTitle /*=NULL*/,
DWORD dwIcon /*=NIIF_NONE*/,
UINT uTimeout /*=10*/ )
{
#ifndef SYSTEMTRAY_USEW2K
return FALSE;
#else
// Bail out if we're not on Win 2K.
if (!m_bWin2K)
return FALSE;

// Verify input parameters.

// The balloon tooltip text can be up to 255 chars long.
ASSERT(AfxIsValidString(szText));
ASSERT(lstrlen(szText) < 256);

// The balloon title text can be up to 63 chars long.
if (szTitle)
{
ASSERT(AfxIsValidString( szTitle));
ASSERT(lstrlen(szTitle) < 64);
}

// dwBalloonIcon must be valid.
ASSERT(NIIF_NONE == dwIcon || NIIF_INFO == dwIcon ||
NIIF_WARNING == dwIcon || NIIF_ERROR == dwIcon);

// The timeout must be between 10 and 30 seconds.
ASSERT(uTimeout >= 10 && uTimeout <= 30);


m_tnd.uFlags = NIF_INFO;
_tcsncpy_s(m_tnd.szInfo, szText, 256);
if (szTitle)
_tcsncpy_s(m_tnd.szInfoTitle, szTitle, 64);
else
m_tnd.szInfoTitle[0] = _T('\0');
m_tnd.dwInfoFlags = dwIcon;
m_tnd.uTimeout = uTimeout * 1000; // convert time to ms

BOOL bSuccess = Shell_NotifyIcon (NIM_MODIFY, &m_tnd);

// Zero out the balloon text string so that later operations won't redisplay
// the balloon.
m_tnd.szInfo[0] = _T('\0');

return bSuccess;
#endif
}


我的调用。

bool rv = m_sysTray.ShowBalloon("123456", "123456", NIIF_INFO, 20);


我跟了下。
返回是1.
为什么托盘不显示消息呢。
还是我对函数理解有错。

大家帮帮忙。
...全文
398 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
na2650945 2011-03-22
  • 打赏
  • 举报
回复
问题解决了。
具体解决方法是这个。
http://topic.csdn.net/u/20090410/13/447699cf-cb52-4db4-9402-73dbadd31693.html
估计是shellapi里面会判断这个宏吧。
vs2008里面定义这个宏和XP的特性不一致吧。
na2650945 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 na2650945 的回复:]
C/C++ code

NOTIFYICONDATA Notify={0};
Notify.cbSize = sizeof(NOTIFYICONDATA);
Notify.hWnd = m_hWnd;
Notify.hIcon = m_hIcon;
Notify.uFlags =NIF_ICON | NIF_MESSAGE | NIF_TIP |……
[/Quote]
这个代码有问题嘛?
na2650945 2011-03-22
  • 打赏
  • 举报
回复

NOTIFYICONDATA Notify={0};
Notify.cbSize = sizeof(NOTIFYICONDATA);
Notify.hWnd = m_hWnd;
Notify.hIcon = m_hIcon;
Notify.uFlags =NIF_ICON | NIF_MESSAGE | NIF_TIP |NIF_INFO;
Notify.dwInfoFlags = NIIF_INFO;
Notify.uTimeout = 2000;
Notify.uCallbackMessage = WM_ICON_NOTIFY;
memcpy(Notify.szTip,"123",3);
memcpy(Notify.szInfoTitle,"123",3);
memcpy(Notify.szInfo,"123",3);
bool rv = Shell_NotifyIcon(NIM_MODIFY,¬ify);

修改过的代码。
哪里有问题嘛?
为什么shell_notifyicon返回0.
谢谢啦。
浩南_哥 2011-03-22
  • 打赏
  • 举报
回复
MSN上有现成的例子啊
Using ToolTip Controls
这不是鸭头 2011-03-22
  • 打赏
  • 举报
回复
直接自己写吧
Shell_NotifyIcon
比用别人的类还方便
Dreadnought 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 na2650945 的回复:]

引用 4 楼 huangcheng90 的回复:
C/C++ code

void SetTray(HWND hWnd,int nIcon, int nAction,LPWSTR lsInfo,LPWSTR lsBullonInfo)
{
NOTIFYICONDATA Notify={0};
Notify.cbSize =sizeof(NOTIFYICONDATA);
Notify……
[/Quote]
修改图标,如果你不需要修改使用NIM_ADD就可以了
na2650945 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huangcheng90 的回复:]
C/C++ code

void SetTray(HWND hWnd,int nIcon, int nAction,LPWSTR lsInfo,LPWSTR lsBullonInfo)
{
NOTIFYICONDATA Notify={0};
Notify.cbSize =sizeof(NOTIFYICONDATA);
Notify.hWnd =hWnd;
……
[/Quote]
请问。
nAction这个值传递的是NIM_MODIFY这个嘛?
syq13 2011-03-21
  • 打赏
  • 举报
回复
学习了
疯狂-的-蜗牛 2011-03-21
  • 打赏
  • 举报
回复
我刚好做了一个这样的程序:

void CMyPlayDlg::CreateNotifyIcon(void)
{
NOTIFYICONDATA nd;
nd.cbSize=sizeof(NOTIFYICONDATA);
nd.hWnd=m_hWnd;
nd.uID=IDI_ICON1;
nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nd.uCallbackMessage=MYWM_NOTIFYICON;
nd.hIcon = m_hIcon;
nd.szTip[sizeof(nd.szTip)/sizeof(wchar_t)-1] = '\0';
wcsncpy(nd.szTip,OLESTR("此处加入你想要提示"),sizeof(nd.szTip)/sizeof(wchar_t)-1);
Shell_NotifyIcon(NIM_ADD, &nd);

}
还要添加一个删除托盘的函数:

void CMyPlayDlg::DeleteNotifyIcon(void)
{
NOTIFYICONDATA nd;
nd.cbSize=sizeof(NOTIFYICONDATA);
nd.hIcon=m_hIcon;
nd.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
nd.hWnd=m_hWnd;
nd.uCallbackMessage=MYWM_NOTIFYICON;
nd.uID=IDI_ICON1;

Shell_NotifyIcon(NIM_DELETE,&nd);
}
VS2008测试通过!
Dreadnought 2011-03-21
  • 打赏
  • 举报
回复

void SetTray(HWND hWnd,int nIcon, int nAction,LPWSTR lsInfo,LPWSTR lsBullonInfo)
{
NOTIFYICONDATA Notify={0};
Notify.cbSize =sizeof(NOTIFYICONDATA);
Notify.hWnd =hWnd;
Notify.hIcon =LoadIcon(hInst,MAKEINTRESOURCE(nIcon));
Notify.uFlags =NIF_ICON | NIF_MESSAGE | NIF_TIP |NIF_INFO;
Notify.dwInfoFlags = NIIF_INFO;
Notify.uTimeout = 2000;
Notify.uCallbackMessage =WM_TOTRAY;
LPWSTR strInfo=_T("提示");
StringCchCopy(Notify.szTip,_countof(Notify.szTip ),lsInfo);
StringCchCopy(Notify.szInfoTitle,_countof(Notify.szInfoTitle),strInfo);
StringCchCopy(Notify.szInfo,_countof(Notify.szInfo),lsBullonInfo);
Shell_NotifyIcon(nAction,¬ify);

}

给你个我封装好了的函数,从我程序里面截取的,VS2010+WIN7可以正常使用...... 那个类你只贴了一段,实在是看不出来哪里有问题
na2650945 2011-03-21
  • 打赏
  • 举报
回复
来人呀。
来人呀。
na2650945 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 huangcheng90 的回复:]
返回1代表函数执行成功,另外你添加了托盘图标没?或者你托盘图标显示出来没?貌似bullon的显示需要与托盘图标一起…
[/Quote]

m_sysTray.Create(NULL, WM_ICON_NOTIFY, "11111", m_hIcon, IDR_POPUP_MENU, FALSE);

已经添加了。
我的问题就是返回非零值。
然后没显示呢。
托盘图标已经显示出来了。
还有什么细节能影响那个showbullon呢。
大家帮忙。
Dreadnought 2011-03-21
  • 打赏
  • 举报
回复
返回1代表函数执行成功,另外你添加了托盘图标没?或者你托盘图标显示出来没?貌似bullon的显示需要与托盘图标一起…

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧