一、涉及的API
//托盘程序需要的API
1、shell_notifyicon(long dwmessage,ref nstr_notifyicondata lpdata)
功能:创建、修改、删除托盘图标
参数:dwmessage 0:创建托盘图标;1:修改托盘图标;2:删除图标
lpdata 结构体
结构体定义:
long cbsize 结构体长度,固定为88;
long hwnd 图标消息接收窗口;
long uid 任务栏图标对应的应用程序定义的标识符;
long uflags 结构体成员有效标志,1:hicon有效,2:ucallbackmessage有效,4:sztip有效,可以组合
long ucallbackmessage 返回给窗口hwnd的消息
long hicon 图标
character sztip[64] 鼠标移动到图标时显示的文字
pb声明:
function integer shell_notifyicon (long dwmessage,ref nstr_notifyicondata lpdata) library "shell32" alias for "Shell_NotifyIconA"
2、loadimage(long hinst,string lpszName,long uType ,long cxDesired ,long cyDesired ,long fuLoad )
功能:装载图片
参数:hinst 包含要装载图片的模块实例的句柄,如果是OEM图片,则此参数为0
lpszName 图片文件名(带路径)
uType 装载图片的类型,0:bitmap,2:cursor,1:icon
cxDesired utype为1,2时表示图像的宽度(象素),如果utype为0则必须设为0
cyDesired utype为1,2时表示图像的高度(象素),如果utype为0则必须设为0
fuLoad 设为0
pb声明:
function long loadimage (long hinst,string lpsz,long un1,long n1,long n2,long un2) library "user32" alias for "LoadImageA"
3、destroyicon(long hicon)
功能:销毁图片
参数:hicon 图片句柄
pb声明:
function long destroyicon (long hicon) library "user32" alias for "DestroyIcon"
4、CreatePopupMenu()
功能:创建一个弹出菜单
pb声明:
Function long CreatePopupMenu() Library "user32"
5、AppendMenu (long hMenu, long wFlags,long wIDNewItem,string lpNewItem)
功能:增加一个菜单项
参数:hMenu 弹出菜单句柄
wFlags 控制菜单项的各种参数(可组合,详细标识请参考MSDN)
wIDNewItem 菜单项ID,通过此ID来确定选择的菜单
lpNewItem 菜单显示文字
pb声明:
Function long AppendMenu (long hMenu, long wFlags,long wIDNewItem,string lpNewItem) Library "user32" Alias for "AppendMenuA"
6、TrackPopupMenu (long hMenu,long wFlags,long xx,long yy,long nReserved,long hwnd,long lprc)
功能:弹出菜单
参数:hmenu 菜单句柄
wflags 弹出菜单显示选项(详细选项请参考MSDN)
xx 弹出菜单的X坐标
yy 弹出菜单的Y坐标
nReserved 设为0
hwnd 弹出菜单对应的窗口
lprc 无效参数(设为0)
pb声明:
Function long TrackPopupMenu (long hMenu,long wFlags,long xx,long yy,long nReserved,long hwnd,long lprc) Library "user32"
7、GetCursorPos (POINT lpPoint)
功能:获取鼠标所在的屏幕位置
参数:lppoint 结构体
结构体定义:
long x x坐标
long y y坐标
pb声明:
Function long GetCursorPos (ref POINT lpPoint) Library "user32"
8、DestroyMenu (long hMenu)
功能:销毁菜单
参数:hMenu 菜单句柄
pb声明:
Function long DestroyMenu (long hMenu) Library "user32" Alias for "DestroyMenu"
9、SetForegroundWindow(ulong hwnd)
功能:将窗口设置在前
参数:hwnd 窗口句柄
pb声明:
Function ulong SetForegroundWindow(ulong hwnd) LIBRARY "user32.dll"
二、PB实例(实例变量nstr_notifyicondata istr_notifyicon)
1、创建图盘图标(窗口OPEN时):
long ll_hnd
string ls_iconname
//图标文件
ls_iconname = 'comm.ico'
ll_hnd = loadimage(0,ls_iconname,1,0,0,16)
if ll_hnd = 0 then
messagebox("错误","装载位图文件失败,程序无法启动!",stopsign!)
return false
else
istr_notifyicon.cbsize = 88
istr_notifyicon.hwnd = handle(this)
istr_notifyicon.uid = 0
istr_notifyicon.hicon = ll_hnd
istr_notifyicon.uflags = 7
istr_notifyicon.ucallbackmessage = 1025 //pb自定义消息pbm_custom02
istr_notifyicon.sztip = '托盘程序'
shell_notifyicon(0,istr_notifyicon)
return true
end if
2、接收消息(自定义pbm_custom02事件)
int li_select
point lp_position
long ll_hmenu
choose case lparam
case 516 //鼠标右键单击按下
ll_hMenu = CreatePopupMenu()
AppendMenu(ll_hMenu,0,1,"菜单A")
AppendMenu(ll_hMenu,2048,5,"")//菜单分隔横线
AppendMenu(ll_hMenu,0,2,"关闭")
GetCursorPos(lp_position)
SetForegroundWindow(handle(this)) //将窗口前置,防止点击右键后必须选择菜单项才能关闭菜单
li_select = TrackPopupMenu(ll_hMenu,2 + 256 + 128,lp_position.x,lp_position.y,0,handle(this),0)
choose case li_select
case 1
//菜单A相关操作
case 2
post close(this)
end choose
DestroyMenu(ll_hmenu)
end choose
3、窗口关闭(CLOSE事件)
istr_notifyicon.ucallbackmessage = 0
shell_notifyicon(2,istr_notifyicon)
if istr_notifyicon.hicon <> 0 then
destroyicon(istr_notifyicon.hicon)
end if
istr_notifyicon.hicon = 0