VC实现托盘气泡提示

如果在VC6.0环境下,要将ShellAPI.h文件中的关于任务栏提示的函数和常量替换为下面的内容:

/// /
/// / Tray notification definitions
/// /

typedef 
struct  _NOTIFYICONDATAA {
        DWORD cbSize;
        HWND hWnd;
        UINT uID;
        UINT uFlags;
        UINT uCallbackMessage;
        HICON hIcon;
#if  (_WIN32_IE < 0x0500)
        CHAR   szTip[
64 ];
#else
        CHAR   szTip[
128 ];
#endif
#if  (_WIN32_IE >= 0x0500)
        DWORD dwState;
        DWORD dwStateMask;
        CHAR   szInfo[
256 ];
        union {
            UINT  uTimeout;
            UINT  uVersion;
        } DUMMYUNIONNAME;
        CHAR   szInfoTitle[
64 ];
        DWORD dwInfoFlags;
#endif
#if  (_WIN32_IE >= 0x600)
        GUID guidItem;
#endif
} NOTIFYICONDATAA, 
* PNOTIFYICONDATAA;
typedef 
struct  _NOTIFYICONDATAW {
        DWORD cbSize;
        HWND hWnd;
        UINT uID;
        UINT uFlags;
        UINT uCallbackMessage;
        HICON hIcon;
#if  (_WIN32_IE < 0x0500)
        WCHAR  szTip[
64 ];
#else
        WCHAR  szTip[
128 ];
#endif
#if  (_WIN32_IE >= 0x0500)
        DWORD dwState;
        DWORD dwStateMask;
        WCHAR  szInfo[
256 ];
        union {
            UINT  uTimeout;
            UINT  uVersion;
        } DUMMYUNIONNAME;
        WCHAR  szInfoTitle[
64 ];
        DWORD dwInfoFlags;
#endif
#if  (_WIN32_IE >= 0x600)
        GUID guidItem;
#endif
} NOTIFYICONDATAW, 
* PNOTIFYICONDATAW;
#ifdef UNICODE
typedef NOTIFYICONDATAW NOTIFYICONDATA;
typedef PNOTIFYICONDATAW PNOTIFYICONDATA;
#else
typedef NOTIFYICONDATAA NOTIFYICONDATA;
typedef PNOTIFYICONDATAA PNOTIFYICONDATA;
#endif   //  UNICODE


#define  NOTIFYICONDATAA_V1_SIZE     FIELD_OFFSET(NOTIFYICONDATAA, szTip[64])
#define  NOTIFYICONDATAW_V1_SIZE     FIELD_OFFSET(NOTIFYICONDATAW, szTip[64])
#ifdef UNICODE
#define  NOTIFYICONDATA_V1_SIZE      NOTIFYICONDATAW_V1_SIZE
#else
#define  NOTIFYICONDATA_V1_SIZE      NOTIFYICONDATAA_V1_SIZE
#endif

#define  NOTIFYICONDATAA_V2_SIZE     FIELD_OFFSET(NOTIFYICONDATAA, guidItem)
#define  NOTIFYICONDATAW_V2_SIZE     FIELD_OFFSET(NOTIFYICONDATAW, guidItem)
#ifdef UNICODE
#define  NOTIFYICONDATA_V2_SIZE      NOTIFYICONDATAW_V2_SIZE
#else
#define  NOTIFYICONDATA_V2_SIZE      NOTIFYICONDATAA_V2_SIZE
#endif


#if  (_WIN32_IE >= 0x0500)
#define  NIN_SELECT          (WM_USER + 0)
#define  NINF_KEY            0x1
#define  NIN_KEYSELECT       (NIN_SELECT | NINF_KEY)
#endif

#if  (_WIN32_IE >= 0x0501)
#define  NIN_BALLOONSHOW     (WM_USER + 2)
#define  NIN_BALLOONHIDE     (WM_USER + 3)
#define  NIN_BALLOONTIMEOUT  (WM_USER + 4)
#define  NIN_BALLOONUSERCLICK (WM_USER + 5)
#endif


#define  NIM_ADD         0x00000000
#define  NIM_MODIFY      0x00000001
#define  NIM_DELETE      0x00000002
#if  (_WIN32_IE >= 0x0500)
#define  NIM_SETFOCUS    0x00000003
#define  NIM_SETVERSION  0x00000004
#define      NOTIFYICON_VERSION 3
#endif

#define  NIF_MESSAGE     0x00000001
#define  NIF_ICON        0x00000002
#define  NIF_TIP         0x00000004
#if  (_WIN32_IE >= 0x0500)
#define  NIF_STATE       0x00000008
#define  NIF_INFO        0x00000010
#endif
#if  (_WIN32_IE >= 0x600)
#define  NIF_GUID        0x00000020
#endif

#if  (_WIN32_IE >= 0x0500)
#define  NIS_HIDDEN      0x00000001
#define  NIS_SHAREDICON  0x00000002

//  says this is the source of a shared icon

//  Notify Icon Infotip flags
#define  NIIF_NONE       0x00000000
//  icon flags are mutually exclusive
//  and take only the lowest 2 bits
#define  NIIF_INFO       0x00000001
#define  NIIF_WARNING    0x00000002
#define  NIIF_ERROR      0x00000003
#define  NIIF_ICON_MASK  0x0000000F
#if  (_WIN32_IE >= 0x0501)
#define  NIIF_NOSOUND    0x00000010
#endif
#endif

SHSTDAPI_(BOOL) Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA lpData);
SHSTDAPI_(BOOL) Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW lpData);
#ifdef UNICODE
#define  Shell_NotifyIcon  Shell_NotifyIconW
#else
#define  Shell_NotifyIcon  Shell_NotifyIconA
#endif   //  !UNICODE

/// /
/// / End Tray Notification Icons
/// /

然后在stdafx.h文件中添加以下内容:

#ifndef _WIN32_IE        // 允许使用 IE 4.0 或更高版本的特定功能。
#define _WIN32_IE 0x0500 // 为 IE 5.0 及更新版本改变为适当的值。
#endif

自定义消息及处理函数:

#define WM_ICONNOTIFY  WM_USER + 909 //图标响应消息(lParam)
#define ID_TASKBARICON 100           //参数(wParam)
ON_MESSAGE(WM_ICONNOTIFY, OnNotifyIcon)

添加变量: NOTIFYICONDATA m_nid;

在触发事件函数中添加代码:

SetIcon();
ShowBalloonTip("正在监控中...", "进程监控程序", 3000, 1);

初始化系统托盘图标:

void  CDlg::SetIcon()
{
 m_nid.cbSize 
=   sizeof (NOTIFYICONDATA);   
 m_nid.hWnd   
=  m_hWnd;
 m_nid.uID    
=  ID_TASKBARICON;  // 发出的消息中的wParam参数
 m_nid.uFlags  =  NIF_ICON | NIF_MESSAGE | NIF_TIP;
 m_nid.uCallbackMessage
       
=  WM_ICONNOTIFY;  // 点击托盘图标系统发出的消息(即发出的消息中的lParam参数)
 m_nid.hIcon   =  LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));  // 图标文件
 strcpy(m_nid.szTip,  " 进程监控程序 " );
 Shell_NotifyIcon(NIM_ADD, 
& m_nid);  // 加入图标
 ShowWindow(SW_HIDE);  // 隐藏窗体
}

托盘气泡提示函数:

BOOL CDlg::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;
 strcpy(m_nid.szInfo,szMsg 
?  szMsg : _T( "" ));
 strcpy(m_nid.szInfoTitle,szTitle 
?  szTitle : _T( "" ));
 
return  Shell_NotifyIcon(NIM_MODIFY,  & m_nid);
}

双击系统托盘,使程序正常化:

LRESULT CDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
 POINT rpoint;
 CMenu tmenu;
 GetCursorPos(
& rpoint);
 
// 如果在托盘图标上双击左键
  if  ( ( wParam  ==  ID_TASKBARICON )  &&  ( lParam  ==  WM_LBUTTONDBLCLK ) )   
 {
  ShowWindow(SW_SHOW); 
// 显示窗体
  Shell_NotifyIcon(NIM_DELETE,  & m_nid);  // 删除系统托盘图标
 }
 
// 如果在托盘图标上单击右键
  if  ( ( wParam  ==  ID_TASKBARICON )  &&  ( lParam  ==  WM_RBUTTONDOWN ) )   
 {
  tmenu.LoadMenu(IDR_MAINMENU); 
// 加载系统主菜单
  SetForegroundWindow();  // 将程序置于桌面顶部,否则菜单将不会消失
  
// 在点击图标处弹出系统菜单的第一项
  tmenu.GetSubMenu( 0 ) -> TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,rpoint.x, rpoint.y,  this ); 
 }
 
return   0 ;
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值