请点击图标下载浏览
附件
首先需要更新一下VC6.0的SDK,方法如下: 把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 MYWM_NOTIFYICON WM_USER+1 afx_msg void OnMyIconNotify(WPARAM wParam,LPARAM lParam); ON_MESSAGE(MYWM_NOTIFYICON,OnMyIconNotify)
添加变量: NOTIFYICONDATA m_nData;
在任务栏通知区添加图标和提示的代码:
m_nData.cbSize=sizeof(NOTIFYICONDATA); m_nData.hWnd=GetSafeHwnd(); m_nData.uFlags=NIF_MESSAGE|NIF_INFO|NIF_ICON; m_nData.uCallbackMessage=MYWM_NOTIFYICON; m_nData.uID=IDR_MAINFRAME; m_nData.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_nData.dwInfoFlags=NIIF_INFO;
_tcscpy(m_nData.szInfoTitle,"管理员"); _tcscpy(m_nData.szInfo,"欢迎使用");
Shell_NotifyIcon(NIM_ADD,&m_nData);
修改气泡提示的代码:
void CTipDlg::OnButton1() { _tcscpy(m_nData.szInfoTitle,"提醒你"); _tcscpy(m_nData.szInfo,"内容改变"); m_nData.uTimeout=1000; m_nData.uVersion=NOTIFYICON_VERSION; Shell_NotifyIcon(NIM_MODIFY,&m_nData);
}
删除的代码: BOOL CTipDlg::DestroyWindow() { Shell_NotifyIcon(NIM_DELETE,&m_nData); return CDialog::DestroyWindow(); }
消息处理函数:
void CTipDlg::OnMyIconNotify(WPARAM wParam,LPARAM lParam) { UINT uMouseMsg=LOWORD(lParam); switch(uMouseMsg) { case WM_LBUTTONDBLCLK: SendMessage(WM_CLOSE,0,0); break;
case WM_LBUTTONDOWN: Shell_NotifyIcon(NIM_MODIFY,&m_nData); break; } }
具体使用方法请参考源代码和相关资料!
顺便提供一下在VB中的使用方法:
'添加两个菜单'注意:要运行本全程,您必须安装 Win2000/XP 或更高版本的操作系统(Shell version 5 or better) '在窗口中添加菜单如下: ' 标题 名称 ' 测试 mnuTest ' ...关于 mnuabout ' ...退出 mnuexit '然后将以下代码复制到窗体代码区: Option Explicit '向窗口发送消息 Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lparam As Any) As Long '获取鼠标坐标(全屏幕) Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Type POINTAPI X As Long Y As Long End Type '设置窗口为前景窗口 Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long '***********************最小化到任务栏要使用的API、常数、枚举等开始************************* Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long Private Type NOTIFYICONDATA cbSize As Long 'NOTIFYICONDATA类型的大小,用Len(变量名)获得即可 hwnd As Long '窗体的名柄 uId As Long '图标资源的ID号,通常使用 vbNull uFlags As Long '使哪些参数有效它是以下枚举类型中的 NIF_INFO Or NIF_ICON Or NIF_TIP Or NIF_MESSAGE 四个常数的组合 uCallBackMessage As Long '接受消息的事件 hIcon As Long '图标名柄 szTip As String * 128 '当鼠标停留在图标上时显示的Tip文本 dwState As Long '通常为 0 dwStateMask As Long '通常为 0 szInfo As String * 256 'Tip文本正文 uTimeoutOrVersion As Long '由于VB中没有Union类型,只能用Long型代替 szInfoTitle As String * 64 'Tip文本的标题 dwInfoFlags As Long End Type Private Const NOTIFYICON_VERSION = 3 Private Const NOTIFYICON_OLDVERSION = 0 '操作任务栏图标的常数 Private Const NIM_ADD = &H0 '添加图标 Private Const NIM_MODIFY = &H1 '修改图标 Private Const NIM_DELETE = &H2 '删除图标 Private Const NIM_SETFOCUS = &H3 Private Const NIM_SETVERSION = &H4 Private Const NIF_MESSAGE = &H1 Private Const NIF_ICON = &H2 Private Const NIF_TIP = &H4 Private Const NIF_STATE = &H8 Private Const NIF_INFO = &H10 Private Const NIS_HIDDEN = &H1 Private Const NIS_SHAREDICON = &H2 'Tip上的图标 Private Const NIIF_NONE = &H0 '没有图标 Private Const NIIF_WARNING = &H2 '“警告”图标(黄色的“!”) Private Const NIIF_ERROR = &H3 '“错误”图标(红色的“X”) Private Const NIIF_INFO = &H1 '“消息”图标(蓝色的“i”) Private Const WM_MOUSEMOVE = &H200 '在图标上移动鼠标 Private Const WM_LBUTTONDOWN = &H201 '鼠标左键按下 Private Const WM_LBUTTONUP = &H202 '鼠标左键释放 Private Const WM_LBUTTONDBLCLK = &H203 '双击鼠标左键 Private Const WM_RBUTTONDOWN = &H204 '鼠标右键按下 Private Const WM_RBUTTONUP = &H205 '鼠标右键释放 Private Const WM_RBUTTONDBLCLK = &H206 '双击鼠标右键 Private Const WM_SETHOTKEY = &H32 '响应您定义的热键 Private Const SC_RESTORE = &HF120& '还原窗口 Private Const WM_SYSCOMMAND = &H112 '系统消息 Private nfIconData As NOTIFYICONDATA Public Enum TipType [ttAdd] = NIM_ADD [ttModify] = NIM_MODIFY [ttDelete] = NIM_DELETE End Enum '***********************最小化到任务栏要使用的API、常数、枚举等结束************************* '显示、修改或删除 Balloon ToolTip Private Sub ShowToolTip(frmName As Form, ttTipType As TipType, Optional strTip As String = "", Optional strTitle As String = "", Optional strInfo As String = "") If ttTipType = ttDelete Then Call Shell_NotifyIcon(NIM_DELETE, nfIconData) Exit Sub End If With nfIconData .cbSize = Len(nfIconData) .hwnd = frmName.hwnd .uId = vbNull .uFlags = NIF_INFO Or NIF_ICON Or NIF_TIP Or NIF_MESSAGE .hIcon = frmName.Icon .szTip = strTip & vbNullChar .dwState = 0 .dwStateMask = 0 .szInfo = strInfo & vbNullChar .uTimeoutOrVersion = 5000 .szInfoTitle = strTitle & vbNullChar .dwInfoFlags = NIIF_INFO .uCallBackMessage = WM_LBUTTONUP End With Call Shell_NotifyIcon(ttTipType, nfIconData) End Sub
Private Sub Form_Load() Call ShowToolTip(Me, ttAdd, "Hello!", "Hello!", "看到了吗?这个就是 Balloon ToolTip!") End Sub Private Sub Form_Unload(Cancel As Integer) Call ShowToolTip(Me, ttDelete) End Sub Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim Result As Long Dim Msg As Long 'X的值依赖与显示模式的设置 If Me.ScaleMode = vbPixels Then Msg = X Else Msg = X / Screen.TwipsPerPixelX End If Select Case Msg Case WM_LBUTTONDOWN '在这里加入鼠标左键释放时你想做的操作 If Me.WindowState = vbMinimized Then Me.Show SendMessage Me.hwnd, WM_SYSCOMMAND, SC_RESTORE, 0 '还原窗口大小 Else Me.WindowState = vbMinimized Me.Hide End If End Select End Sub
|