hWnd完全一致。
Dim nid As NOTIFYICONDATA
nid.cbSize = Len(nid)
nid.hwnd = Me.hwnd
nid.uID = 9998
Shell_NotifyIcon NIM_DELETE, nid
4.修改图标
下面一段代码实现图标的修改。这里的uId和hWnd也必须和当初加入图标时所使用的 uId和hWnd完全一致。同时还必须正确设置uFlags和hIcon。uFlags必须设置为NIF_ICON,表示修改对图标有效;hIcon应设为新图标。
Dim nid As NOTIFYICONDATA
nid.cbSize = Len(nid)
nid.hWnd = Me.hWnd
nid.uID = 9999
nid.uFlags = NIF_ICON
nid.hIcon = Image1.Picture
Shell_NotifyIcon NIM_MODIFY, nid
修改提示消息和消息编号的方法与此类似。不同点是当修改提示消息时须将uFlags设为NIF_TIP,修改消息编号时须将uFlags设为NIF_MESSAGE。
三. 回调函数
在前面已经讲到,当用户在图标上按下鼠标时,系统将接收并传递消息给窗口消息处理回调函数进行具体的处理。用户可以在回调函数中对不同的消息进行不同的程序处理来定制自己的应用程序的功能(例如鼠标左击时弹出一个菜单,鼠标右击时弹出另一个菜单,鼠标双击时显示主窗口等等)。在任务栏提示区中加入图标时设置的消息编号uMessage就是用来告诉回调函数此消息来自图标对应的程序,回调函数即可据此进行处理。回调函数是个比较复杂的问题,下面从VB
程序的运行机制入手来具体阐述任务栏编程中回调函数的实现方法。
1. VB应用
程序的运行机制
VB应用程序的运行是基于Windows的消息传递机制的。Windows的工作方式是一种多任务多线程的工作方式,VB程序运行时是受Windows控制的。具体讲,一个VB程序运行时Windows的进程管理模块就会给它创建一个进程。进程与Windows之间的通讯是通过消息传递来实现的:进程发送一个消息给Windows并等待,Windows处理完此消息后将结果会传给进程。由于Windows支持多线程,因此一个进程可以在内部创建多个线程,这些线程共享此进程的地址空间、全局变量、文件以及各种信号。除了共享地址空间外,各个线程是独立的,每个线程有自己的程序计数器、堆栈、寄存器及状态(等待、就绪、运行)。VB程序在运行时,通过对其所含的每个控件都创建一个线程来并行地处理控件的事件。一个控件在进程内对应一个线程。这些线程也同样通过消息与Windows进行通讯。Windows为运行于其上的应用程序提供了确省的消息处理程序。例如在一个VB程序运行时,右击一个文本框就会弹出一个包含“剪切”、“复制”、“粘贴”等功能的快捷菜单,这就是由Windows的确省消息处理程序来完成的。Windows系统允许用户截获应用程序窗口的消息并用自定义的过程来加以处理。这个自定义的过程称为“回调”函数,用户可在回调函数中对感兴趣的消息进行适当的处理,并将其它的消息交给系统原来的消息处理过程处理。这种“替代”似乎很困难,但实际上却是完全可以实现的。
2. 用回调函数来处理任务栏提示区的消息
回调函数(Callback Function)是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。
通常情况下,回调函数采用标准Windows API的调用方式,即_stdcall,当然,DLL编制者可以自已定义调用方式,但客户程序也必须遵守相同的规定。在_stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。
将应用程序图标放入任务栏提示区后,如果用户要想打开该应用程序窗口,必须到任务栏提示区中去点击图标。但这并不意味着用户点击后,窗口就会自动显示出来。每当用户点击图标,系