用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
分享到:
相关推荐
在VB程序中,用户可以发送AT命令并通过接收返回的响应来测试和配置这些设备。 6. **第4章_串口调试程序**:根据压缩包子文件的名称,我们可以推测这是一个教程或项目的一部分,第4章可能详细讲解了如何使用VB编写...
通过分析这个只包含接收功能的VB源码,开发者可以了解到如何使用`MSComm控件`来监听串口,接收到的数据如何被处理,以及如何设计一个简单的串口接收程序。这对于理解串口通信的基本原理和实践操作非常有帮助。 虽然...
在这个“评委评分程序”中,我们主要探讨的是如何利用VB来设计一个评分系统,该系统可以接收多位评委的评分,然后在排除最高分和最低分后,计算出剩余评分的平均值。 一、程序结构与设计 1. 窗体(Form)设计:`...
例如,设置CommPort属性为要使用的串口号(通常为1-4),设置Settings属性来设定波特率、数据位、停止位和校验方式。波特率决定了数据传输的速度,常见的有9600、19200、38400等;数据位一般为5、7、8位;停止位通常...
在VB程序设计中,这通常通过循环结构实现,不断发送指令以维持云台的运动状态。 2. 点动控制:点动控制,又称点到点转动,是指用户每次按下按钮,云台都会移动一个固定角度或距离,松开按钮后停止。这种模式适合于...
通过对VB程序的不断优化,可以构建出稳定可靠的RFID打卡系统。 总之,VB串口通信和MFRC522的结合,为RFID应用提供了灵活且实用的解决方案。通过VB上位机程序,我们可以方便地控制和管理RFID设备,实现各种应用场景...
3. **脚本解释器**:VB程序中可能用到VBScript或JScript等脚本引擎来解析和执行用户输入的函数。例如,使用`ExecuteStatement`或`Run`方法来运行包含函数的字符串。 4. **数学函数解析**:程序需要能理解并解析用户...
在VB程序中,我们需要配置MSComm控件的属性,如PortName(指定串口号,如"COM1")、Settings(设定波特率、数据位、校验位和停止位)、InputMode(设置输入模式,如Text或Binary)。然后,我们可以通过CommPort属性...
1. 电压设置:VB程序可以设定电源的输出电压,用户可以通过界面上的输入框或滑动条进行设定,程序则将该值转化为SCPI命令发送给电源设备。 2. 电流限制:为了保护电路,VB程序还允许设置电流上限,一旦超过设定值,...
在VB中,我们可以使用TextBox控件接收用户的输入,然后将这些文本信息转化为字幕内容。Label控件则用于显示字幕,通过适时更新Label的Text属性,可以实现字幕的滚动效果。为了实现字幕的连续滚动,通常需要结合Timer...
VB串口通信是Visual Basic编程中的一个重要领域,它允许应用程序通过串行端口与外部设备进行数据交换。在本主题中,我们将深入探讨VB串口通信的原理、MSComm控件的应用以及如何利用这些资源来实现串口通信。 首先,...
《VB6.0串口通信实例程序》是一个利用Visual Basic 6.0(VB6.0)编程环境设计的简单而实用的串行通信应用程序。串口通信在各种硬件设备的连接与数据交换中扮演着重要的角色,尤其在工业自动化、物联网设备、嵌入式...
通过设定种子(如当前时间)确保每次运行时生成不同的序列,增加验证码的不可预测性。 2. **字符串操作**:生成的随机数需要转换为字符并组合成字符串。VB中的`CStr`函数可以将数值转换为字符串,`Join`函数可以将...
【S7-200 VB监控程序及VB源码】是一个专为西门子S7-200系列PLC(可编程逻辑控制器)设计的可视化监控系统,它利用Visual Basic(VB)语言进行开发,提供了实时通讯功能,确保了与PLC之间的稳定交互。在工业自动化...
《VB趣味程序集锦》是朱恩源先生的一本著作,由上海教育出版社出版,主要针对初学者和爱好者,展示了Visual Basic(VB)编程语言在实际应用中的趣味性和实用性。这本书通过一系列精心设计的程序实例,帮助读者深入...
首先,我们需要在VB程序中设置MSComm控件的属性,如ComPort(指定串口号)、InputLen(设定接收缓冲区长度)、Settings(设定通信参数,如9600,N,8,1,表示波特率9600,无校验,8位数据,1位停止位)。然后,我们...
6. **错误处理**:在VB通信程序中,要设置适当的错误处理机制,例如使用`On Error`语句,以确保在遇到通信问题时程序能够正常运行。 在`温度控制`这个子文件中,可能包含了与温度相关的仪表通信代码,例如读取温度...
首先,VB6是微软公司推出的一种可视化编程工具,全称为Visual Basic 6.0,它是基于事件驱动的编程语言,适合快速开发Windows应用程序。在这个撞球游戏中,开发者利用VB6的图形用户界面(GUI)组件,如Form,来创建...
VB中,我们同样使用Winsock组件,但需要配置其Listen属性为True,设定LocalPort属性为监听的端口。当有客户端连接时,会触发ServerConnect事件,此时可以创建一个新的线程或线程池处理客户端的请求。接收到数据后,...