| 
 以下是代码片段:
  .386 .model flat, stdcall option casemap: none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib 
;include \masm32\include\ole32.inc ;includelib \masm32\lib\ole32.lib 
include \masm32\include\shell32.inc includelib \masm32\lib\shell32.lib 
include \masm32\include\user32.inc includelib \masm32\lib\user32.lib 
;include \masm32\include\advapi32.inc ;includelib \masm32\lib\advapi32.lib ;include \masm32\include\comdlg32.inc ;includelib \masm32\lib\comdlg32.lib 
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS ; prototype ;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS WinMain     PROTO :DWORD,:DWORD,:DWORD,:DWORD 
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS ; const ;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS WM_SHELLNOTIFY equ WM_USER+200 IDI_TRAY    equ 0 
NOTIFYICONDATA50 struct     cbSize  dword ?     hwnd    HANDLE ?     uID     dword ?     uFlags  dword ?     uCallbackMessage    dword ?     hIcon   HANDLE ?     szTip   db  128 dup(?)  ;Version 5.0为128个,以前为 64 个     dwState dword ?     ;图标状态:NIS_HIDDEN:图标是隐藏的;NIS_SHAREDICON:图标是共享的     dwStateMask dword ? ;指明dwState的哪些位可以被读取,如设置为NIS_HIDDEN则表示图标的隐藏状态可以被读取     szInfo  byte 256 dup(?)     ;气泡提示内容   union       uTimeout  dd  ?  ;Union类型系统默认设置最短10秒,最长30秒       uVersion dd ?   ends     szInfoTitle byte 64 dup(?)  ;气泡提示标题     dwInfoFlags dword ?         ;指明是否在气泡提示上显示图标 NOTIFYICONDATA50 ends   NOTIFYICON_VERSION = 3 NOTIFYICON_OLDVERSION = 0 
NIM_ADD     = 0 NIM_MODIFY  = 1 NIM_DELETE  = 2 NIM_SETFOCUS    = 3 NIM_SETVERSION  = 4 
NIF_MESSAGE = 1 ;uCallbackMessage项包含了有效的信息 NIF_ICON    = 2 ;hIcon项包含了有效的信息 NIF_TIP     = 4 ;szTip项包含了有效的信息 NIF_STATE   = 8 NIF_INFO    = 010h   NIS_HIDDEN  = 1 NIS_SHAREDICON = 2 
;/---气泡提示信息图标控制 NIIF_NONE   = 0 ;不显示图标 NIIF_INFO   = 1 ;“信息”图标(蓝色) NIIF_WARNING= 2 ;“警告”图标(黄色) NIIF_ERROR  = 3 ;“错误”图标(红色) ;---/ 
NIN_SELECT  =   WM_USER   +   0;    NIN_BALLOONSHOW = WM_USER + 2   ;当气泡提示显示后外壳发送此消息 NIN_BALLOONHIDE = WM_USER + 3   ;当气泡提示消失时(比如通知栏图标被删除)外壳发送此消息,但气泡提示由于超时而消失不会产生此消息 NIN_BALLOONTIMEOUT = WM_USER + 4    ;当气泡提示由于超时而消失时外壳发送此消息 NIN_BALLOONUSERCLICK = WM_USER + 5  ;当用户点击鼠标时(点击气泡提示和通知栏图标均可)外壳发送此消息 NINF_KEY    =   1 NIN_KEYSELECT   =   NIN_SELECT or NINF_KEY 
IDC_ckbShowTrayIcon equ 100 IDC_ckbShowBalloon  equ 110 c_AppQuit           equ 1b c_IconShowed        equ 10b 
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS .data ;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS g_szClassName label byte g_szAppName     db "Balloon_Tooltip_Demo", 0 g_szButton      db "button", 0 g_szShowTrayIcon db "显示托盘图标", 0 g_szShowBalloon  db "显示气泡信息", 0 
g_szAppQuit     db "程序退出", 0 g_szInfo        db "这是一个提示信息内容!", 0 g_szInfoTitle   db "这是一个提示信息标题!", 0 g_szClickTrayIcon db "你击中了系统托盘区的图标", 0 g_szClickBalloonOrIcon db "你击中了气泡或系统托盘区的图标", 0 g_szMessageHide db "信息隐藏了", 0 g_szShowMessageNow db "开始显示信息了", 0 g_szMessageTimeOut  db "信息显示时间到了", 0 
g_dwFlag    dword 0 
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS .data? ;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS g_hInstance  HINSTANCE ? g_hWndMain   HWND ? g_stNoteIcon NOTIFYICONDATA50 <> 
.code start: 
invoke GetModuleHandle, NULL mov g_hInstance, eax invoke WinMain, g_hInstance, NULL, NULL, SW_SHOWDEFAULT invoke ExitProcess, eax 
WinMain proc hInst: HINSTANCE, hPrevInst: HINSTANCE, CmdLine: LPSTR, CmdShow: DWORD     LOCAL wc: WNDCLASSEX     LOCAL msg: MSG     LOCAL hwnd: HWND 
    mov   wc.cbSize, SIZEOF WNDCLASSEX     mov   wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS     mov   wc.lpfnWndProc, OFFSET WndProc     mov   wc.cbClsExtra, NULL     mov   wc.cbWndExtra, NULL     mov   eax, hInst     mov   wc.hInstance, eax     mov   wc.hbrBackground, COLOR_BTNSHADOW     mov   wc.lpszMenuName, NULL     mov   wc.lpszClassName, OFFSET g_szClassName     invoke LoadIcon, NULL, IDI_APPLICATION     mov   wc.hIcon, eax     mov   wc.hIconSm, eax     invoke LoadCursor, NULL, IDC_ARROW     mov   wc.hCursor, eax     invoke RegisterClassEx, addr wc     invoke CreateWindowEx, NULL, addr g_szClassName, addr g_szAppName,\                WS_OVERLAPPED + WS_CAPTION + WS_SYSMENU, 100, 100, 300, 100,\                NULL, NULL, hInst, NULL;WS_VISIBLE     mov   hwnd, eax     invoke ShowWindow, hwnd, SW_SHOW 
    .while TRUE         invoke GetMessage, ADDR msg, NULL, 0, 0         .BREAK .IF (!eax)         invoke TranslateMessage, ADDR msg         invoke DispatchMessage, ADDR msg     .endw     mov eax, msg.wParam     ret WinMain endp 
 WndProc proc hWndMain: DWORD, uMsg: DWORD, wParam: DWORD, lParam: DWORD     .if uMsg == WM_DESTROY         invoke Shell_NotifyIcon, NIM_DELETE, addr g_stNoteIcon         invoke PostQuitMessage, NULL 
    .elseif uMsg== WM_CLOSE         test   g_dwFlag, c_IconShowed         jz     @DestroyWin         test   g_dwFlag, c_AppQuit         .if    ZERO?             mov    g_stNoteIcon.uTimeout, 20             invoke lstrcpy, addr g_stNoteIcon.szInfo,addr g_szAppQuit             invoke Shell_NotifyIcon, NIM_MODIFY, addr g_stNoteIcon             or     g_dwFlag, c_AppQuit                     invoke ShowWindow, g_hWndMain, SW_HIDE         .else @DestroyWin:             invoke DestroyWindow, g_hWndMain         .endif     .elseif uMsg == WM_CREATE         mov   eax, hWndMain         mov   g_hWndMain, eax 
        invoke RtlZeroMemory, addr g_stNoteIcon, sizeof g_stNoteIcon         mov    eax, g_hWndMain         mov    g_stNoteIcon.hwnd, eax         mov    g_stNoteIcon.cbSize, sizeof g_stNoteIcon         mov    g_stNoteIcon.uID, IDI_TRAY         mov    g_stNoteIcon.uFlags, NIF_ICON + NIF_MESSAGE + NIF_TIP         mov    g_stNoteIcon.uCallbackMessage, WM_SHELLNOTIFY         invoke LoadIcon, NULL, IDI_WINLOGO         mov    g_stNoteIcon.hIcon, eax         invoke lstrcpy, addr g_stNoteIcon.szTip, addr g_szAppName 
        invoke CreateWindowEx, NULL, addr g_szButton, addr g_szShowTrayIcon,\             WS_BORDER + WS_CHILD + WS_VISIBLE + BS_AUTOCHECKBOX, 5, 5, 130, 20,\             g_hWndMain, IDC_ckbShowTrayIcon, g_hInstance, NULL 
        invoke CreateWindowEx, NULL, addr g_szButton, addr g_szShowBalloon,\             WS_BORDER + WS_CHILD + WS_VISIBLE, 5, 30, 130, 20,\             g_hWndMain, IDC_ckbShowBalloon, g_hInstance, NULL 
    .elseif (uMsg == WM_COMMAND)             mov eax, wParam             mov edx, eax             shr edx, 16             .IF (dx == BN_CLICKED)                 .if (eax == IDC_ckbShowTrayIcon)                     test g_dwFlag, c_IconShowed                     .if ZERO?                         mov eax, NIM_ADD                         or  g_dwFlag, c_IconShowed                     .else                         mov eax, NIM_DELETE                         and g_dwFlag, not c_IconShowed                     .endif                     invoke Shell_NotifyIcon, eax, addr g_stNoteIcon                 .elseif (eax==IDC_ckbShowBalloon)                     xor    eax, eax                     mov    g_stNoteIcon.dwState, eax                     mov    g_stNoteIcon.dwStateMask, eax 
                    invoke lstrcpy, addr g_stNoteIcon.szInfo, addr g_szInfo                     mov    g_stNoteIcon.uTimeout, 200 
                    invoke lstrcpy, addr g_stNoteIcon.szInfoTitle, addr g_szInfoTitle                     mov    g_stNoteIcon.dwInfoFlags, NIIF_INFO 
                    mov    g_stNoteIcon.uFlags, NIF_ICON + NIF_MESSAGE + NIF_TIP + NIF_INFO 
                    mov eax, NIM_MODIFY                     test   g_dwFlag, c_IconShowed                     .if    ZERO?                         or g_dwFlag, c_IconShowed                         invoke SendDlgItemMessage, g_hWndMain, IDC_ckbShowTrayIcon, BM_SETCHECK, BST_CHECKED, 0                         mov eax, NIM_ADD                     .endif                                              invoke Shell_NotifyIcon, eax, addr g_stNoteIcon                 .endif             .ENDIF     .elseif uMsg==WM_SHELLNOTIFY         .if wParam==IDI_TRAY             mov eax, lParam             .if (eax==NIN_BALLOONSHOW);当气泡提示显示后外壳发送此消息                 invoke MessageBox, g_hWndMain, addr g_szShowMessageNow, addr g_szAppName, MB_ICONINFORMATION             .else                 test   g_dwFlag, c_AppQuit                 .if    ZERO?                     .if (eax==NIN_BALLOONHIDE)                         invoke MessageBox, g_hWndMain, addr g_szMessageHide, addr g_szAppName, MB_ICONINFORMATION                     .elseif (eax==WM_RBUTTONDOWN || eax==WM_LBUTTONDOWN)                         invoke MessageBox, g_hWndMain, addr g_szClickTrayIcon, addr g_szAppName, MB_ICONINFORMATION                     .elseif (eax==NIN_BALLOONTIMEOUT);当气泡提示由于超时而消失时外壳发送此消息                         invoke MessageBox, g_hWndMain, addr g_szMessageTimeOut, addr g_szAppName, MB_ICONINFORMATION                     .elseif (eax==NIN_BALLOONUSERCLICK)                         invoke MessageBox, g_hWndMain, addr g_szClickBalloonOrIcon, addr g_szAppName, MB_ICONINFORMATION                     .endif                 .else                     invoke SendMessage, g_hWndMain, WM_CLOSE, 0, 0     .endif             .endif         .endif     .else         invoke DefWindowProc, hWndMain, uMsg, wParam, lParam                 ret     .endif 
    xor eax, eax     ret WndProc endp 
end start
   |