统会以消息方式通知窗口的消息处理回调函数,所以只要在应用程序窗口的回调函数中进行适当的编程就可以实现。
窗口消息回调函数的格式如下所示:
Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
因为回调函数是自定义的函数,因此函数名和参数名都可以自定义。各参数的含义如下表所示:
hWnd
窗口句柄
Msg
等于当初调用Shell_NotifyIcon时所设置的uCallbackMessage的值
wParam
等于当初调用Shell_NotifyIcon时所设置的uID的值
lParam
等于鼠标消息,例如WM_LBUTTONDOWN(按下鼠标左键)等
在VB使用回调函数存在不少限制:1、回调函数必须放到标准的模块(Module)中,而不能放在类模块或窗体代码中;2、AddressOf运算符只能用于自定义的过程、函数或属性,不能将其用于Declare语句声明的外部函数,也不能用于类型库中的函数;3、写在AddressOf后面的过程、函数和属性必须与有关的声明和过程在同一个工程中;4、由于回调函数要与系统直接交互,所以调试十分困难,如果回调函数中有错误,可能会引起非法操作,致使VB运行环境崩溃。
在VB中用回调函数处理任务栏提示区消息的具体步骤如下:
(1)在启动窗体的Form_Load()事件中加入以下代码。
prevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) ''获取系统确省的窗口消息处理函数句柄
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf WndProc ''指定WndProc为新的消息处理函数
''加入图标
Dim nid As NOTIFYICONDATA
nid.cbSize = Len(nid)
nid.hwnd = Me.hwnd
nid.uID = 9998
nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
nid.hIcon = Me.Icon
nid.uCallbackMessage = WM_USER + 100 ''定义消息编号
Shell_NotifyIcon NIM_ADD, nid ''
(2)在模块中加入回调函数WndProc的代码
Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_USER + 100 Then ''''该消息等于调用Shell_NotifyIcon时定义的uCallbackMessage
If lParam = WM_LBUTTONDOWN Or lParam = WM_RBUTTONDOWN Then
''当按下鼠标左键或右键时弹出菜单
frmCaution.PopupMenu frmCaution.mnuaa
End If
End If
''其它的消息交给系统处理,prevWndProc为原来的窗口消息处理函数的句柄
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
End Function
执行以上的代码时,API函数GetWindowLong()、SetWindowLong()和CallWindowProc()的声明需要先加入到模块中,这些声明可通过VB所带的“API文本浏览器”获得。
四. 实例分析:一个定时音乐提醒程序
对于一个从事计算机工作的人来说,长时间坐在计算机前面工作是常有的事。持续的屏幕注视往往使得眼睛十分疲劳。最好是能每隔一段时间休息一下。但
计算机工作尤其是编程往往会使人全神贯注,忘记了时间。我们可以设计一个定时音乐提醒程序,让它每隔一段时间就自动提醒自己休息一会儿。
下面就结合前述的任务栏编程思想给出具体的程序实现。该程序具有每隔一段时间就播放一段音乐提醒和到某个特定时刻播放音乐提醒的功能,并可以由用户自定义提醒时间、提醒内容以及音效。
1、新建一个工程,并加入五个窗体,分别命名为frmCaution、frmTipMess、frmSound、frmChangTime和frmAbout 。其中frmcaution为显示提醒消息的启动窗体,frmtipmess为用户自定义提醒内容的窗体,frmsound为用户自定义提醒声音的窗体,frmchangtime为用户自定义提醒时间方式的窗体,frmabout为“关于”信息显示窗体。
2、在frmcaution上加入一个菜单“mnuaa”,在“mnuaa”下加入菜单“设置提醒时间……”、“设置提醒消息……”、“音效……”、“关于……”、“退出”。菜单“mnuaa”就作