dwMessage传入的DWORD参数制定将要发生的动作。可以是以下几个值 NIM_ADD添加图标到状态区. NOTIFYICONDATA结构的hWnd和uId指出那个将对那个图标进行操作。 NIM_DELETE删除图标。NIM_MODIFY修改图标NIM_SETFOCUS5.0版本可以使用,这个版本在WINDOWS2000上可以找到,NT,98/95都是旧版本。Returns focus to the taskbar notification area(设置焦点到任务栏消息区).如果任务栏显示了一个菜单,但是用户想使用 ESC 取消他, 使用 NIM_SETFOCUS 参数可以返回到消息区。
NIM_SETVERSION5.0版本 指出任务栏的行为与版本一致,版本的参数在NOTIFYICONDATA结构中可以找到。
lpdata传入参数,NOTIFYICONDATA结构的地址.
NOTIFYICONDATA 结构--------------------------------------------------------------------------------包含系统处理任务栏状态区的消息。语法typedef struct _NOTIFYICONDATA {DWORD cbSize;//结构大小HWND hWnd;//接受任务栏消息的窗口UINT uID;//应用程序定义的图标ID,当有多个图标时这个ID不代表某一个必须重新定义一个(参见代码)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;
uFlags
NIF_ICON uIcon有效NIF_MESSAGE uCallbackMessage 有效NIF_TIP szTip有效NIF_STATE dwStateMask有效NIF_INFO 使用气泡提示代替标准提示 szInfo, uTimeout, szInfoTitle, dwInfoFlags有效NIF_GUID 保留
uCallbackMessage应用程序定义的消息,系统用它来处理任务栏状态区的消息。 hIcon人物栏状态区图标,版本不一样显示图标的颜色位数不一样。szTip字符串提示。版本不一样字符串长度不一样。5.0是128个char。4.0是64。
dwState图标状态5.0版本NIS_HIDDEN隐藏NIS_SHAREDICON显示dwStateMask5.0 指定将要修改的状态。比如使用NIS_HIDDEN来隐藏图标。szInfo5.0版本用于气泡提示最长255个char。uTimeout毫秒延时值。uVersion指定版本值 szInfoTitle气泡提示的标题63各字符。dwInfoFlags5.0版本. Flags 添加图标给气泡提示。可以是以下值NIIF_ERRORAn error icon.NIIF_INFOAn information icon.NIIF_NONENo icon.NIIF_WARNINGA warning icon.NIIF_ICON_MASKVersion 6.0. Reserved.NIIF_NOSOUNDVersion 6.0. Do not play the associated sound. Applies only to balloon ToolTips.guidItem6.0版本,保留。
以下介绍代码 vc6 win32首先要保证project setting/link library中设置shell32.lib
//stdafx.中加入#include <shellapi.h>
#define NORMAL 1#define RUN 2#define ID_TIMER 1
#define UWM_NOTIFYICON WM_USER+1
//trayicon.cpp// TrayIcon.cpp : Defines the entry point for the application.//
#include "stdafx.h"#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
HINSTANCE hinst;HICON hicon[2];UINT uStatus=NORMAL;//程序运行状态 NORMAL图标不变化 RUN图标变化int iIcon=0;//指示但前使用的图标
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){//declare varibalestatic TCHAR szAppName[]=TEXT("托盘图标");TCHAR szCaption[]=TEXT("托盘图标使用例子");HWND hwnd;MSG msg;WNDCLASS wndclass;
hinst=hInstance;
hicon[0]=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));hicon[1]=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2));
wndclass.style=CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc=WndProc;//窗口过程地址wndclass.cbClsExtra=0;//指定额外分配给wndclass的字节wndclass.cbWndExtra=0;//指定额外的字节分配给wnd实例wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));wndclass.lpszClassName=szAppName;wndclass.lpszMenuName=NULL;
if(!RegisterClass(&wndclass)){//ErrorMessageBox();return 0;}//默认的窗口风格且主窗口不可见不再任务栏hwnd=CreateWindowEx(WS_EX_TOOLWINDOW,szAppName,szCaption,WS_OVERLAPPEDWINDOW|WS_POPUP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);ShowWindow(hwnd,SW_SHOW);UpdateWindow(hwnd);while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}
return msg.wParam;}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){HDC hdc;PAINTSTRUCT ps;NOTIFYICONDATA tnd;
tnd.cbSize=sizeof(NOTIFYICONDATA);tnd.hWnd=hwnd;strcpy(tnd.szTip,TEXT("托盘示例"));tnd.uCallbackMessage=UWM_NOTIFYICON;tnd.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;tnd.uID=IDI_ICON;//前面有定义,注意不是图标IDI_ICON1或者IDI_ICON2
switch(message){//TIMER事件中使图标变化case WM_TIMER:if(iIcon==0)iIcon++;elseiIcon--;tnd.hIcon=hicon[iIcon];Shell_NotifyIcon(NIM_MODIFY,&tnd);return 0 ; case WM_COMMAND:switch (LOWORD (wParam)){//退出程序case IDM_APP_EXIT:SendMessage (hwnd, WM_CLOSE, 0, 0) ;return 0;//启动TIMERcase IDM_RUN:if (SetTimer (hwnd, ID_TIMER, 500, NULL))uStatus=RUN;return 0;//停止TIMERcase IDM_STOP:KillTimer (hwnd, ID_TIMER) ;iIcon=0;tnd.hIcon=hicon[iIcon];Shell_NotifyIcon(NIM_MODIFY,&tnd);uStatus=NORMAL;return 0 ; }return 0;//自定义事件处理鼠标在TRAYICON上的点击case UWM_NOTIFYICON://如果是鼠标右击if((UINT) lParam==WM_RBUTTONDOWN){//如果是IDI_ICONif((UINT)wParam==IDI_ICON){POINT pt;HMENU hmenu,hsubmenu;
hmenu=LoadMenu(hinst,MAKEINTRESOURCE(IDR_MENU1));hsubmenu=GetSubMenu(hmenu, 0); //取得光标当前位置GetCursorPos(&pt);SetForegroundWindow(hwnd);if(uStatus==NORMAL){EnableMenuItem (hmenu, IDM_STOP, MF_GRAYED) ;EnableMenuItem (hmenu, IDM_RUN, MF_ENABLED) ;}else{EnableMenuItem (hmenu, IDM_RUN, MF_GRAYED) ;EnableMenuItem (hmenu, IDM_STOP, MF_ENABLED) ;}//弹出菜单TrackPopupMenu(hsubmenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL); DestroyMenu(hmenu);}}return 0;//窗体产生时在托盘区显示图标case WM_CREATE:tnd.hIcon=hicon[0];Shell_NotifyIcon(NIM_ADD,&tnd);return 0;case WM_PAINT:hdc=BeginPaint(hwnd,&ps);EndPaint(hwnd,&ps);return 0;//退出使删除图标case WM_CLOSE:Shell_NotifyIcon(NIM_DELETE,&tnd);PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);}/*void ErrorMessageBox(){LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language(LPTSTR) &lpMsgBuf,0,NULL );
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );}*/
代码下载
我的主页
