由于VC 6中的shellapi.h中的NOTIFYICONDATA结构体定义的变量比较少,不支持托盘气球,因此改用了VS08进行的编译。
程序可以正常编译运行,就是没出现气球提示,先贴出一下全部代码吧,方便大家交流。
C/C++ code#include<windows.h>
#include<tchar.h>
#define WM_SHELLNOTIFY WM_USER+5
#define IDI_TRAY 0
#define IDM_RESTORE 100
#define IDM_EXIT 101
//#define _WIN32_IE 0x0600
TCHAR ClassName[]=_T("TrayIconWinClass");
TCHAR AppName[]=_T("TrayIcon Demo");
TCHAR RestoreString[]=_T("&Restore");
TCHAR ExitString[]=_T("&Exit Program");
HINSTANCE g_hInstance;
NOTIFYICONDATA note;
HMENU hPopupMenu;
INT_PTR CALLBACK ProcWinMain(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
POINT pt;
switch(Msg)
{
case WM_CREATE:
hPopupMenu=CreatePopupMenu();
AppendMenu(hPopupMenu,MF_STRING,IDM_RESTORE,RestoreString);
AppendMenu(hPopupMenu,MF_STRING,IDM_EXIT,ExitString);
//note.cbSize=sizeof(NOTIFYICONDATA);
//note.uFlags=NIM_ICON|NIM_
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_SIZE:
{
if(wParam==SIZE_MINIMIZED)
{
note.cbSize=sizeof(NOTIFYICONDATA);
note.hWnd=hWnd;
note.uFlags=NIF_ICON|NIF_MESSAGE|NIF_INFO|NIF_TIP;
note.uID=IDI_TRAY;
note.uCallbackMessage=WM_SHELLNOTIFY;
lstrcpy(note.szTip,AppName);
note.dwInfoFlags=NIIF_INFO;
note.uTimeout=3000;
lstrcpy(note.szInfo,AppName);
lstrcpy(note.szInfoTitle,AppName);
note.hIcon=LoadIcon(NULL,IDI_WINLOGO);
ShowWindow(hWnd,SW_HIDE);
Shell_NotifyIcon(NIM_ADD,¬e);
}
}
break;
case WM_COMMAND:
if(lParam==0)
{
Shell_NotifyIcon(NIM_DELETE,¬e);
if(LOWORD(wParam)==IDM_RESTORE)
{
ShowWindow(hWnd,SW_RESTORE);
}
else
DestroyWindow(hWnd);
}
break;
case WM_SHELLNOTIFY:
if(wParam==IDI_TRAY)
{
if(lParam==WM_RBUTTONDOWN)
{
GetCursorPos(&pt);
TrackPopupMenu(hPopupMenu,TPM_LEFTALIGN,pt.x,pt.y,0,hWnd,NULL);
}
else if(lParam==WM_LBUTTONDBLCLK)
{
SendMessage(hWnd,WM_COMMAND,IDM_RESTORE,0);
}
}
break;
default:
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
WNDCLASSEX wc;
MSG msg;
HWND hWnd;
g_hInstance = hInstance;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW |CS_DBLCLKS;
wc.lpfnWndProc = (WNDPROC)ProcWinMain;
wc.cbClsExtra = NULL;
wc.cbWndExtra = NULL;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE);
wc.lpszMenuName = NULL;
wc.lpszClassName = ClassName;
wc.hIcon = wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
RegisterClassEx(&wc);
hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,ClassName,AppName,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,350,200,NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
其中托盘气球的那部分代码:
///////////////////////////////////////////////////////////////////////////////////////////////////////
case WM_SIZE:
{
if(wParam==SIZE_MINIMIZED)
{
note.cbSize=sizeof(NOTIFYICONDATA);
note.hWnd=hWnd;
note.uFlags=NIF_ICON|NIF_MESSAGE|NIF_INFO|NIF_TIP;//NIF_INFO必须包含
note.uID=IDI_TRAY;
note.uCallbackMessage=WM_SHELLNOTIFY;
lstrcpy(note.szTip,AppName);
note.dwInfoFlags=NIIF_INFO;
note.uTimeout=3000;
lstrcpy(note.szInfo,AppName);
lstrcpy(note.szInfoTitle,AppName);
note.hIcon=LoadIcon(NULL,IDI_WINLOGO);
ShowWindow(hWnd,SW_HIDE);
Shell_NotifyIcon(NIM_ADD,¬e);}}
break;