金山词霸启示录——通知栏图标 |
通知栏图标,可以用一个免费的小控件:SysTray实现。也可以用一个子类处理控件来实现。后一种方法比较自由,所以我采用了后一种方法。除了一个子类处理控件,还需要一个api函数:Shell_NotifyIcon,以及一个结构:NOTIFYICONDATA。关于它们的说明本站都有,这里就不用费舌了。
添加、修改、移除通知栏图标都比较简单,关键是如何让它响应鼠标事件。在NOTIFYICONDATA结构中,uCallbackMessage字段定义了通知栏图标响应的事件,hwnd字段则定义了响应事件的对象。
在程序里,利用一个图片框来响应通知栏图标的鼠标事件。只需简单的定义NOTIFYICONDATA.hwnd = Picture1.hwnd,那么一旦uCallbackMessage定义的消息在Picture1上发生,就可以看作通知栏图标事件发生了。
所以将子类处理控件绑定到图片框,其拦截的消息为uCallbackMessage定义的消息编号,这里令NOTIFYICONDATA.uCallbackMessage = WM_TrayIcon,而WM_TrayIcon = &H2000(自定义消息)
一旦这个消息被拦截,就可以根据不同的lp参数判断发生的是那一个鼠标动作,事实上我们只需要对鼠标的左右按钮单击事件作出响应(这两个消息分别为WM_LBUTTONUP、WM_RBUTTONUP)
然后再做一个菜单,当WM_RBUTTONUP发生时,就弹出来。
最后请注意,卸载程序时记得移除通知栏图标