vb单击托盘图标显示窗口用的是什么事件啊
1个回答
展开全部
没有现成的事件,需要自定义消息和消息的处理过程。注意这个结构
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。
这样,基本的雏形已经出来了,剩下的移植到你的工程中的代码应该是你自己的事情了。
楼下给的链接的代码我看了下,值得参考。但是没有注释,我在这里给你提炼出一个框架,能够帮助你理解背后的原理。
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。
这样,基本的雏形已经出来了,剩下的移植到你的工程中的代码应该是你自己的事情了。
楼下给的链接的代码我看了下,值得参考。但是没有注释,我在这里给你提炼出一个框架,能够帮助你理解背后的原理。
TableDI
2024-07-18 广告
2024-07-18 广告
将图片放入Excel表格,可以按照以下步骤操作:1. 打开Excel文档,并定位到希望插入图片的单元格。2. 在Excel的菜单栏中,找到并点击“插入”选项卡。3. 在“插入”选项卡中,找到并点击“图片”或“图像”按钮。4. 在弹出的文件选...
点击进入详情页
本回答由TableDI提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询