VC实现托盘气泡提示

本文介绍如何在VC6.0环境下修改ShellAPI.h文件以实现自定义任务栏图标及其通知功能,包括创建图标、显示气泡提示、响应用户交互等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果在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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值