vb单击托盘图标显示窗口用的是什么事件啊

 我来答
BARUTH
2012-12-27 · TA获得超过585个赞
知道小有建树答主
回答量:140
采纳率:100%
帮助的人:83.8万
展开全部
没有现成的事件,需要自定义消息和消息的处理过程。注意这个结构
Public Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type
中的参数uCallBackMessage,它能够用来标识你想要处理的消息。按照你的需求,你可以自定义一个消息叫做SNM_BUTTONDOWN = WM_USER+WM_LBUTTONDOWN(或WM_RBUTTONDOWN,如果你要捕获鼠标右键),当然你也可以随便给它一个值,只要确保它大于WM_USER以防止与系统消息预定义的消息编号冲突。我比较喜欢这种风格,可以显式的看出我要捕获的是什么消息。

给定了这个消息编号后,你要做的就是捕获这个消息,并提供消息处理过程。再次注意到NOTIFYICONDATA结构中的参数hwnd,这个参数标志了接收用户消息的窗口的句柄。也就是说单击图标产生的消息是发送给句柄为hwnd的窗口,并由它的窗口处理程序负责处理的。你如果自己用过纯API创建窗体实例的话应该不会对我接下来要讲的概念陌生:

任何一个有hwnd属性的窗口都有一个默认的窗口处理程序,在VB中形如:

Function WndProc(ByVal hwnd As Long, _ '窗口句柄
ByVal uMsg As Long, _ '消息编号
ByVal wParam As Long, _ '消息附带的高位参数
ByVal lParam As Long) As Long '消息附带的低位参数

'函数默认的返回结果为:
WndProc = DefWindowProc(hwnd,uMsg,wParam,lParam)
End Function。

我们要处理自定义的消息SNM_BUTTONDOWN,必须交给这样的窗口处理过程。要实现这个目标,我们要做两件事:1. 获取原窗口处理程序的地址 2. 改变原窗口处理程序的处理过程,使它能够响应并处理我们自定义的消息。这就是所谓的子类化技术。那么,如何实现呢?要用到GetWindowLong和SetWindowLong这两个API函数。前者可以用来获取原窗口处理过程的地址,代码:lng_PrevProcAddr = GetWindowLong(hwnd,GWL_WNDPROC) ‘获取原窗口处理程序的地址
后者设置一个偏移量,用来改变原窗口处理过程的地址,代码:
SetWindowLong(lng_PrevProcAddr,GWL_WNDPROC,AddressOf NewWndProc) ’将远程窗口处理过程的地址改为新的窗口处理过程NewWndProc。

新的窗口处理过程的代码框架如下:
Function NewWndProc(ByVal hwnd As Long, _ '窗口句柄
ByVal uMsg As Long, _ '消息编号
ByVal wParam As Long, _ '消息附带的高位参数
ByVal lParam As Long) As Long '消息附带的低位参数

Select Case uMsg
Case SNM_BUTTONDOWN '只处理我关心的消息
If lParam = WM_LBUTTONDOWN Then '如果产生这个消息是因为左键按下
'添加你的处理代码
End If
NewWndProc = 0
Exit Function
Case Else '其他消息我不关心,交个原窗口处理程序做默认的处理
NewWndProc = CallWindowProc(lng_PrevProcAddr,hwnd,uMsg,wParam,lParam)
End Select

End Function。

这样,基本的雏形已经出来了,剩下的移植到你的工程中的代码应该是你自己的事情了。
楼下给的链接的代码我看了下,值得参考。但是没有注释,我在这里给你提炼出一个框架,能够帮助你理解背后的原理。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式