VB为自己的程序设定消息(可接收处理)

VB为自己的程序设定消息(可接收处理)

Posted by JiaJia 5 March,2009 (0)Comment
  用API函数 SetWindowLong 指定处理消息的窗口过程为自定义的函数 WindowProc,捕获消息ID为 WM_USER+1 的自定义消息或系统消息。并且,为了保证窗口能正确的响应消息,需要保存原来默认的窗口过程并在自定义函数WindowProc中调用。如下例,在按钮事件中发送自定义消息,WindowProc 捕获了窗口大小变化的系统定义消息和用户自定义的消息并显示用户自定义的消息参数 wParam。

Form 部分代码
Private Sub Command1_Click()
Dim wParam As Long
Dim
lParam As Long
Dim
lResult As Long
 wParam = 12345
 lResult = SendMessage(Me.hwnd, WM_USER + 1 , wParam, lParam)
End Sub

Private Sub
Form_Load()
 Me.Tag = Hook(Me.hwnd)
End Sub

Private Sub
Form_Unload(Cancel As Integer )
 Unhook Me.hwnd, Me.Tag
End Sub

Mod 部分代码
Option Explicit

Private Declare Function CallWindowProc Lib "user32" Alias _
"CallWindowProcA" ( ByVal lpPrevWndFunc As Long , _
ByVal hwnd As Long , ByVal Msg As Long , _
ByVal wParam As Long , ByVal lParam As Long ) As Long

Public Declare Function
GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(
ByVal hwnd As Long , ByVal nIndex As Long ) As Long

Private Declare Function
SetWindowLong Lib "user32" Alias _
"SetWindowLongA" ( ByVal hwnd As Long , _
ByVal nIndex As Long , ByVal dwNewLong As Long ) As Long

Public Declare Function
SendMessage Lib "user32" Alias _
"SendMessageA" ( ByVal hwnd As Long , ByVal wMsg As Long , _
ByVal wParam As Long , lParam As Any) As Long

Private Const
GWL_WNDPROC = - 4
Public Const GWL_USERDATA = (- 21 )
Public Const WM_SIZE = &H5
Public Const WM_USER = &H400

Public Function Hook( ByVal hwnd As Long ) As Long
 Dim pOld As Long
'指定自定义的窗口过程
 pOld = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
'保存原来默认的窗口过程指针
 SetWindowLong hwnd, GWL_USERDATA, pOld
 Hook = pOld
End Function

Public Sub
Unhook( ByVal hwnd As Long , ByVal lpWndProc As Long )
 Dim temp
As Long
  '注释:Cease subclassing.
 temp = SetWindowLong(hwnd, GWL_WNDPROC, lpWndProc)
End Sub

Function
WindowProc( ByVal hw As Long , ByVal uMsg As Long , ByVal wParam As Long , ByVal lParam As Long ) As Long
 If uMsg = WM_SIZE Then
  '处理WM_SIZE消息
MsgBox "收到消息 WM_SIZE"
 End If
 If uMsg = WM_USER + 1 Then
MsgBox wParam
 End
If
 Dim lpPrevWndProc As Long
'查询原来默认的窗口过程指针
 lpPrevWndProc = GetWindowLong(hw, GWL_USERDATA)
'调用原来的窗口过程
 WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg,wParam, lParam)
End Function

在VB中用自定义过程捕获并处理消息的详细信息和例子请参考:
Q170570 HOWTO: Build a Windows Message Handler with AddressOf in Visual
http://support.microsoft.com/support/kb/articles/q170/5/70.asp
Q168795 HOWTO: Hook Into a Windows Messages Using AddressOf
http://support.microsoft.com/support/kb/articles/q168/7/95.asp
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值