关键就是重写窗体的回调函数处理要处理的消息,其他的交给vb自己的窗体回调函数去作. 不过定义的这个窗体的回调函数必须要在模块中定义才行,在窗体的Form_load函数中进行调用.下面是例子,相关的常量以及api函数的定义我就不写拉.'这个函数在module中进行定义 Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ' 我们也进行消息过滤,不过我们指拦截我们感兴趣的消息 ' 其他消息我们懒得处理,交给 VB 默认的窗口函数去处理吧。 Select Case uMsg Case WM_COPYDATA ...... Case 其他消息 end select' 这里又是关键,因为其他我们不关心的消息我们自己不处理,所以必须由 VB 的默认处理函数处理 ' lpPrevWndProc 其实就是一个函数指针,它指向 VB 默认窗口函数 WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) End Function '以上是module中定义的窗体的回调函数.下面是窗体对其调用.Private Sub Form_Load() gHW = Me.hwnd ' 保存窗体的句柄 ' 下面是关键,完成两个工作:1、将我们自己的全局函数替换为新的窗体回调函数 ' 2、保存原来的 VB 默认窗户口函数地址 lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc) End Sub
编辑处理响应事件,三楼说得很清楚了。 要说明的就是VB本身只能做进程内的。给窗口发消息用SendMessage函数,下面是说明。 发送什么消息要具体情况具体分析了。SendMessage, SendMessageBynum, SendMessageByString VB声明 Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) Declare Function SendMessageBynum& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) Declare Function SendMessageByString& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) 说明 调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回。SendMessageBynum, SendMessageByString是该函数的“类型安全”声明形式 返回值 Long,由具体的消息决定 参数表 参数 类型及说明 hwnd Long,要接收消息的那个窗口的句柄 wMsg Long,消息的标识符 wParam Long,具体取决于消息 lParam Any,具体取决于消息
不过定义的这个窗体的回调函数必须要在模块中定义才行,在窗体的Form_load函数中进行调用.下面是例子,相关的常量以及api函数的定义我就不写拉.'这个函数在module中进行定义
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
' 我们也进行消息过滤,不过我们指拦截我们感兴趣的消息
' 其他消息我们懒得处理,交给 VB 默认的窗口函数去处理吧。
Select Case uMsg
Case WM_COPYDATA
......
Case 其他消息
end select' 这里又是关键,因为其他我们不关心的消息我们自己不处理,所以必须由 VB 的默认处理函数处理
' lpPrevWndProc 其实就是一个函数指针,它指向 VB 默认窗口函数
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function
'以上是module中定义的窗体的回调函数.下面是窗体对其调用.Private Sub Form_Load()
gHW = Me.hwnd ' 保存窗体的句柄
' 下面是关键,完成两个工作:1、将我们自己的全局函数替换为新的窗体回调函数
' 2、保存原来的 VB 默认窗户口函数地址
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
End Sub
看完你的VB的问题,我感觉我学的VB是不是和你们的不一样,我上的是北大青鸟程序员,为什么我看不懂?是不是我学的不专呀!!!
要说明的就是VB本身只能做进程内的。给窗口发消息用SendMessage函数,下面是说明。
发送什么消息要具体情况具体分析了。SendMessage, SendMessageBynum, SendMessageByString VB声明
Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
Declare Function SendMessageBynum& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
Declare Function SendMessageByString& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String)
说明
调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回。SendMessageBynum, SendMessageByString是该函数的“类型安全”声明形式
返回值
Long,由具体的消息决定
参数表
参数 类型及说明
hwnd Long,要接收消息的那个窗口的句柄
wMsg Long,消息的标识符
wParam Long,具体取决于消息
lParam Any,具体取决于消息
但是如果接触到底层一点的东西,比如要和其他程序交互,就需要用到消息了.
因为vb本身的特长不是干这个,所以一般讨论得少,我也是找了好久才找到的,呵呵.