`
caobihole
  • 浏览: 949071 次
文章分类
社区版块
存档分类
最新评论

使用系统托盘图标,显示 Balloon Tooltip 的 MASM32 演示代码

 
阅读更多
;功能:演示使用系统托盘图标,显示BalloonTooltip
;作者: PurpleEndurer | 紫郢剑侠㊣ 于广西河池
;日期内容
;----------------------------------------------------------------------
;2007.08.23完成。
;2007.08.21创建。

.386
.modelflat,stdcall
optioncasemap: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
WinMainPROTO:DWORD,:DWORD,:DWORD,:DWORD

;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
;const
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
WM_SHELLNOTIFYequWM_USER+200
IDI_TRAYequ0

NOTIFYICONDATA50struct
cbSizedword?
hwndHANDLE?
uIDdword?
uFlagsdword?
uCallbackMessagedword?
hIconHANDLE?
szTipdb128dup(?);Version5.0为128个,以前为64个
dwStatedword?;图标状态:NIS_HIDDEN:图标是隐藏的;NIS_SHAREDICON:图标是共享的
dwStateMaskdword?;指明dwState的哪些位可以被读取,如设置为NIS_HIDDEN则表示图标的隐藏状态可以被读取
szInfobyte256dup(?);气泡提示内容
union
uTimeoutdd?;Union类型系统默认设置最短10秒,最长30秒
uVersiondd?
ends
szInfoTitlebyte64dup(?);气泡提示标题
dwInfoFlagsdword?;指明是否在气泡提示上显示图标
NOTIFYICONDATA50ends

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_SELECTorNINF_KEY

IDC_ckbShowTrayIconequ100
IDC_ckbShowBalloonequ110
c_AppQuitequ1b
c_IconShowedequ10b

;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
.data
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
g_szClassNamelabelbyte
g_szAppNamedb"Balloon_Tooltip_Demo",0
g_szButtondb"button",0
g_szShowTrayIcondb"显示托盘图标",0
g_szShowBalloondb"显示气泡信息",0

g_szAppQuitdb"程序退出",0
g_szInfodb"这是一个提示信息内容!",0
g_szInfoTitledb"这是一个提示信息标题!",0
g_szClickTrayIcondb"你击中了系统托盘区的图标",0
g_szClickBalloonOrIcondb"你击中了气泡或系统托盘区的图标",0
g_szMessageHidedb"信息隐藏了",0
g_szShowMessageNowdb"开始显示信息了",0
g_szMessageTimeOutdb"信息显示时间到了",0

g_dwFlagdword0

;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
.data?
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
g_hInstanceHINSTANCE?
g_hWndMainHWND?
g_stNoteIconNOTIFYICONDATA50<>

.code
start:

invokeGetModuleHandle,NULL
movg_hInstance,eax
invokeWinMain,g_hInstance,NULL,NULL,SW_SHOWDEFAULT
invokeExitProcess,eax

WinMainprochInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCALwc:WNDCLASSEX
LOCALmsg:MSG
LOCALhwnd:HWND

movwc.cbSize,SIZEOFWNDCLASSEX
movwc.style,CS_HREDRAWorCS_VREDRAWorCS_DBLCLKS
movwc.lpfnWndProc,OFFSETWndProc
movwc.cbClsExtra,NULL
movwc.cbWndExtra,NULL
moveax,hInst
movwc.hInstance,eax
movwc.hbrBackground,COLOR_BTNSHADOW
movwc.lpszMenuName,NULL
movwc.lpszClassName,OFFSETg_szClassName
invokeLoadIcon,NULL,IDI_APPLICATION
movwc.hIcon,eax
movwc.hIconSm,eax
invokeLoadCursor,NULL,IDC_ARROW
movwc.hCursor,eax
invokeRegisterClassEx,addrwc
invokeCreateWindowEx,NULL,addrg_szClassName,addrg_szAppName,/
WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU,100,100,300,100,/
NULL,NULL,hInst,NULL;WS_VISIBLE
movhwnd,eax
invokeShowWindow,hwnd,SW_SHOW

.whileTRUE
invokeGetMessage,ADDRmsg,NULL,0,0
.BREAK.IF(!eax)
invokeTranslateMessage,ADDRmsg
invokeDispatchMessage,ADDRmsg
.endw
moveax, msg.wParam
ret
WinMainendp


WndProcprochWndMain:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
.ifuMsg==WM_DESTROY
invokeShell_NotifyIcon,NIM_DELETE,addrg_stNoteIcon
invokePostQuitMessage,NULL

.elseifuMsg==WM_CLOSE
testg_dwFlag,c_IconShowed
jz@DestroyWin
testg_dwFlag,c_AppQuit
.ifZERO?
movg_stNoteIcon.uTimeout,20
invokelstrcpy,addrg_stNoteIcon.szInfo,addrg_szAppQuit
invokeShell_NotifyIcon,NIM_MODIFY,addrg_stNoteIcon
org_dwFlag,c_AppQuit
invokeShowWindow,g_hWndMain,SW_HIDE
.else
@DestroyWin:
invokeDestroyWindow,g_hWndMain
.endif
.elseifuMsg==WM_CREATE
moveax,hWndMain
movg_hWndMain,eax

invokeRtlZeroMemory,addrg_stNoteIcon,sizeofg_stNoteIcon
moveax,g_hWndMain
movg_stNoteIcon.hwnd,eax
movg_stNoteIcon.cbSize,sizeofg_stNoteIcon
movg_stNoteIcon.uID,IDI_TRAY
movg_stNoteIcon.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP
movg_stNoteIcon.uCallbackMessage,WM_SHELLNOTIFY
invokeLoadIcon,NULL,IDI_WINLOGO
movg_stNoteIcon.hIcon,eax
invokelstrcpy,addrg_stNoteIcon.szTip,addrg_szAppName

invokeCreateWindowEx,NULL,addrg_szButton,addrg_szShowTrayIcon,/
WS_BORDER+WS_CHILD+WS_VISIBLE+BS_AUTOCHECKBOX,5,5,130,20,/
g_hWndMain,IDC_ckbShowTrayIcon,g_hInstance,NULL

invokeCreateWindowEx,NULL,addrg_szButton,addrg_szShowBalloon,/
WS_BORDER+WS_CHILD+WS_VISIBLE,5,30,130,20,/
g_hWndMain,IDC_ckbShowBalloon,g_hInstance,NULL

.elseif(uMsg==WM_COMMAND)
moveax,wParam
movedx,eax
shredx,16
.IF(dx==BN_CLICKED)
.if(eax==IDC_ckbShowTrayIcon)
testg_dwFlag,c_IconShowed
.ifZERO?
moveax,NIM_ADD
org_dwFlag,c_IconShowed
.else
moveax,NIM_DELETE
andg_dwFlag,notc_IconShowed
.endif
invokeShell_NotifyIcon,eax,addrg_stNoteIcon
.elseif(eax==IDC_ckbShowBalloon)
xoreax,eax
movg_stNoteIcon.dwState,eax
movg_stNoteIcon.dwStateMask,eax

invokelstrcpy,addrg_stNoteIcon.szInfo,addrg_szInfo
movg_stNoteIcon.uTimeout,200

invokelstrcpy,addrg_stNoteIcon.szInfoTitle,addrg_szInfoTitle
movg_stNoteIcon.dwInfoFlags,NIIF_INFO

movg_stNoteIcon.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP+NIF_INFO

moveax,NIM_MODIFY
testg_dwFlag,c_IconShowed
.ifZERO?
org_dwFlag,c_IconShowed
invokeSendDlgItemMessage,g_hWndMain,IDC_ckbShowTrayIcon,BM_SETCHECK,BST_CHECKED,0
moveax,NIM_ADD
.endif

invokeShell_NotifyIcon,eax,addrg_stNoteIcon
.endif
.ENDIF
.elseifuMsg==WM_SHELLNOTIFY
.ifwParam==IDI_TRAY
moveax,lParam
.if(eax==NIN_BALLOONSHOW);当气泡提示显示后外壳发送此消息
invokeMessageBox,g_hWndMain,addrg_szShowMessageNow,addrg_szAppName,MB_ICONINFORMATION
.else
testg_dwFlag,c_AppQuit
.ifZERO?
.if(eax==NIN_BALLOONHIDE)
invokeMessageBox,g_hWndMain,addrg_szMessageHide,addrg_szAppName,MB_ICONINFORMATION
.elseif(eax==WM_RBUTTONDOWN||eax==WM_LBUTTONDOWN)
invokeMessageBox,g_hWndMain,addrg_szClickTrayIcon,addrg_szAppName,MB_ICONINFORMATION
.elseif(eax==NIN_BALLOONTIMEOUT);当气泡提示由于超时而消失时外壳发送此消息
invokeMessageBox,g_hWndMain,addrg_szMessageTimeOut,addrg_szAppName,MB_ICONINFORMATION
.elseif(eax==NIN_BALLOONUSERCLICK)
invokeMessageBox,g_hWndMain,addrg_szClickBalloonOrIcon,addrg_szAppName,MB_ICONINFORMATION
.endif
.else
invokeSendMessage,g_hWndMain,WM_CLOSE,0,0
.endif
.endif
.endif
.else
invokeDefWindowProc,hWndMain,uMsg,wParam,lParam
ret
.endif

xoreax,eax
ret
WndProcendp

endstart

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics