shellnotifyicon,托盘图标气泡提示问题

要实现这些功能不复杂,首先要了解NOTIFYICONDATA结构体:

NOTIFYICONDATA 结构体说明  包含系统需要的用来传递托盘区域消息的信息。

  1、格式

  typedef struct _NOTIFYICONDATA {

  DWORD cbSize;

  HWND hWnd;

  UINT uID;

  UINT uFlags;

  UINT uCallbackMessage;

  HICON hIcon;

  TCHAR szTip[64];

  DWORD dwState;

  DWORD dwStateMask;

  TCHAR szInfo[256];

  union {

  UINT uTimeout;

  UINT uVersion;

  };

  TCHAR szInfoTitle[64];

  DWORD dwInfoFlags;

  GUID guidItem;

  } NOTIFYICONDATA, *PNOTIFYICONDATA;

  2、成员说明:
cbSize

 

  结构体的大小,以字节为单位。

  hWnd

  窗口的句柄。标示的窗口用来接收与托盘图标相关的消息。Shell_NotifyIcon函数调用时,hWnd和uID成员用来标示具体要操作的图标。

  uID

  应用程序定义的任务栏图标的标识符。Shell_NotifyIcon函数调用时,hWnd和uID成员用来标示具体要操作的图标。通过将多次调用,你可以使用不同的uID将多个图标关联到一个窗口hWnd。

  uFlags

  此成员表明具体哪些其他成员为合法数据(即哪些成员起作用)。此成员可以为以下值的组合:

  NIF_ICON

  hIcon成员起作用。

  NIF_MESSAGE

  uCallbackMessage成员起作用。

  NIF_TIP

  szTip成员起作用。

  NIF_STATE

  dwState和dwStateMask成员起作用。

  NIF_INFO

  使用气球提示代替普通的工具提示框。szInfo, uTimeout, szInfoTitle和dwInfoFlags成员起作用。

  NIF_GUID

  保留。

  uCallbackMessage

  应用程序定义的消息标示。当托盘图标区域发生鼠标事件或者使用键盘选择或激活图标时,系统将使用此标示向由hWnd成员标示的窗口发送消息。消息响应函数的wParam参数标示了消息事件发生的任务栏图标,lParam参数根据事件的不同,包含了鼠标或键盘的具体消息,例如当鼠标指针移过托盘图标时,lParam将为WM_MOUSEMOVE。

  hIcon

  增加、修改或删除的图标的句柄。注意,windows不同版本对于图标有不同要求。Windows XP可支持32位。

  szTip

  指向一个以/0结束的字符串的指针。字符串的内容为标准工具提示的信息。包含最后的/0字符,szTip最多含有64个字符。

  对于Version 5.0 和以后版本,szTip最多含有128个字符(包含最后的/0字符)。

  dwState

  Version 5.0,图标的状态,有两个可选值,如下:

  NIS_HIDDEN

  图标隐藏

  NIS_SHAREDICON

  图标共享

  dwStateMask

  Version 5.0. 指明dwState成员的那些位可以被设置或者访问。比如设置此成员为NIS_HIDDEN,将导致只有hidden状态可以被获取。

  szInfo

  Version 5.0. 指向一个以/0结束的字符串的指针。字符串的内容为气球提示内容。最多含有255个字符。如果要移除已经存在的气球提示信息,设置uFlags成员为NIF_INFO,同时将szInfo设为空。

  uTimeout

  和uVersion成员为联合体。uTimeout表示气球提示超时的时间,单位为毫秒,此时间后气球提示将消失。系统默认气球提示的超时时间最小值为10秒,最大值为30秒。如果设置的uTimeout的值小于10将设置最小值,如果大于30将设置最大值。将超时时间分为最大最小两种,是因为解决不同图标的气球提示同时弹出的问题,详细内容请参考MSDN中NOTIFYICONDATA结构体说明的remarks。

  uVersion

  Version 5.0. 和uTimeout成员为联合体。用来设置使用Windows 95 还是 Windows 2000风格的图标消息接口。请参考Shell_NotifyIcon函数的说明获取更多信息。只有当使用Shell_NotifyIcon函数发送NIM_SETVERSION消息时,此成员才有作用。可选的值如下:

  0

  使用Windows 95风格。针对Windows 2000版本之前的windows设计的软件请使用此值。

  NOTIFYICON_VERSION

  使用Windows 2000风格。 针对Windows 2000版本以及以后版本的windows设计的软件请使用此值。

  szInfoTitle

  Version 5.0. 指向一个以/0结束的字符串的指针。字符串的内容为气球提示的标题。此标题出现在气球提示框的上部,最多含有63个字符。

  dwInfoFlags

  Version 5.0. 设置此成员用来给气球提示框增加一个图标。增加的图标出现在气球提示标题的左侧,注意如果szInfoTitle成员设为空字符串,则图标也不会显示。可选值如下:

  NIIF_ERROR

  错误图标。

  NIIF_INFO

  信息图标。

  NIIF_NONE

  没有图标。

  NIIF_USER

  使用用户使用hIcon成员指明的图标,要求Windows XP Service Pack 2 (SP2)或以后系统。

  NIIF_WARNING

  警告图标。

  NIIF_ICON_MASK

  Version 6.0. 保留。

  NIIF_NOSOUND

  Version 6.0. 禁止播放相应声音。

  guidItem

  Version 6.0. 保留。
看到这里你可能已经很烦躁,这是什么啊,百度百科,MSDN都有啊,用你废话?但是首先要清楚结构体,要实现气球,必须使用NIF_INFO标志,我在实现气球的时候发现用VC2008编译的程序在XP下,win7x86下都没有气泡,而vista,win7x64没问题,这这问题困扰了我。。。。。

当跟到ShellApi.h文件里你便会发现,对于不同版本的系统cbSize有不同的定义,可以加一段代码判断系统版本,比如XP是5.1,win2000是5.2等,再给cbSize选择适当的长度,你的程序在多系统下都不会收到不出气泡提示的困扰了!!!

OSVERSIONINFO osver;

 

    UINT m_MainVersionNumber = 0;

UINT m_MiniVersionNumber = 0;

 

BOOL IsWinXP = FALSE;

BOOL IsWin2K = FALSE;

BOOL IsVista = FALSE;

BOOL IsWin7 = FALSE;

BOOL IsWin9X = FALSE;

 

osver.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );

if (::GetVersionEx( &osver ) )

{

m_MainVersionNumber = osver.dwMajorVersion;

m_MiniVersionNumber = osver.dwMinorVersion;

 

if(osver.dwPlatformId == VER_PLATFORM_WIN32_NT)

{

if(m_MainVersionNumber == 5)

{

if(m_MiniVersionNumber == 1)

IsWinXP = TRUE;

else

IsWin2K = TRUE;

}

else if(m_MainVersionNumber == 6)

{

if(m_MiniVersionNumber == 1)

IsWin7 = TRUE;

else

IsVista = TRUE;

}

else if(m_MainVersionNumber > 6)

{

IsWin7 = TRUE;

}

}

else

IsWin9X = TRUE;

//return TRUE;

}

else

{

m_MainVersionNumber = 0;

m_MiniVersionNumber = 0;

//return FALSE;

}

//

TCHAR szBallomTip[256];

TCHAR szBallomTipTitle[64];

LPCTSTR strTip;

strTip=_T("Mouse Driver");

//

// /*ZeroMemory(szBallomTipTitle,sizeof(szBallomTipTitle));

// ZeroMemory(szBallomTip,sizeof(szBallomTip));*/

//

_tcscpy(szBallomTipTitle,strTip);

_tcscpy(szBallomTip,strTip);

_tcscat(szBallomTip,_T(" is running!"));

//

_tcscpy((wchar_t *)strBallomTip,strTip);

// //strBallomTip=strTip;

// /*UINT nsize = NOTIFYICONDATAW_V3_SIZE;*/

//

// //nsize = sizeof(NOTIFYICONDATA);

//

/*NOTIFYICONDATA NotifyIconData;*/

ZeroMemory(&NotifyIconData, sizeof(NotifyIconData)); 

 

if(IsVista || IsWin7) 

{  

NotifyIconData.cbSize = sizeof(NOTIFYICONDATA);

}

else if(IsWinXP) 

{  

NotifyIconData.cbSize = NOTIFYICONDATA_V3_SIZE;

}

else if(IsWin2K) 

{  

NotifyIconData.cbSize = NOTIFYICONDATA_V2_SIZE;

}

else 

{  

NotifyIconData.cbSize = NOTIFYICONDATA_V1_SIZE;

}

 

 

NotifyIconData.hWnd=this->m_hWnd;

NotifyIconData.hIcon=AfxGetApp( )->LoadIcon(IDI_ICON1);

//NotifyIconData.uFlags=NIF_MESSAGE | NIF_ICON |NIF_INFO | NIF_TIP;

//NotifyIconData.uTimeout=1000;

//NotifyIconData.dwInfoFlags=NIIF_INFO;

//_tcscpy(NotifyIconData.szInfo,strTip);

//_tcscpy(NotifyIconData.szInfoTitle,strTip);

NotifyIconData.uFlags=NIF_MESSAGE | NIF_ICON | NIF_TIP |NIF_INFO;

NotifyIconData.uID=1000;

NotifyIconData.dwInfoFlags=NIIF_INFO;

NotifyIconData.uTimeout=2000;

// NotifyIconData.uVersion=NOTIFYICON_VERSION;

NotifyIconData.dwState=NIS_SHAREDICON;/

NotifyIconData.dwStateMask=NIS_SHAREDICON;

// NotifyIconData.uCallbackMessage=SystrayNotify;

/*_tcscpy(NotifyIconData.szInfoTitle,strTip);

_tcscpy(NotifyIconData.szTip,strTip);

wcsncat((wchar_t *)strBallomTip,L" is running!",15);

_tcscpy(NotifyIconData.szInfo,strBallomTip);*/

 

/*ZeroMemory(NotifyIconData.szInfoTitle,sizeof(NotifyIconData.szInfoTitle));

ZeroMemory(NotifyIconData.szInfo,sizeof(NotifyIconData.szInfo));*/

_tcscpy(NotifyIconData.szTip,szBallomTipTitle);

_tcscpy(NotifyIconData.szInfoTitle,szBallomTipTitle);//,_tcslen(szBallomTipTitle));//szBallomTipTitle

_tcscpy(NotifyIconData.szInfo,szBallomTip);

 

Shell_NotifyIcon(NIM_ADD,&NotifyIconData);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值