`

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

    博客分类:
  • vb
阅读更多

  用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串口调试程序,可发送和接收,有代码

    在VB程序中,用户可以发送AT命令并通过接收返回的响应来测试和配置这些设备。 6. **第4章_串口调试程序**:根据压缩包子文件的名称,我们可以推测这是一个教程或项目的一部分,第4章可能详细讲解了如何使用VB编写...

    VB串口通信之串口接收程序.rar_VB 串口接收_VB 串口程序_VB 串口通信_VB串口_VB源码

    通过分析这个只包含接收功能的VB源码,开发者可以了解到如何使用`MSComm控件`来监听串口,接收到的数据如何被处理,以及如何设计一个简单的串口接收程序。这对于理解串口通信的基本原理和实践操作非常有帮助。 虽然...

    vb小程序 评委评分程序

    在这个“评委评分程序”中,我们主要探讨的是如何利用VB来设计一个评分系统,该系统可以接收多位评委的评分,然后在排除最高分和最低分后,计算出剩余评分的平均值。 一、程序结构与设计 1. 窗体(Form)设计:`...

    vb串口调试程序

    例如,设置CommPort属性为要使用的串口号(通常为1-4),设置Settings属性来设定波特率、数据位、停止位和校验方式。波特率决定了数据传输的速度,常见的有9600、19200、38400等;数据位一般为5、7、8位;停止位通常...

    云台控制系统 用VB程序设计

    在VB程序设计中,这通常通过循环结构实现,不断发送指令以维持云台的运动状态。 2. 点动控制:点动控制,又称点到点转动,是指用户每次按下按钮,云台都会移动一个固定角度或距离,松开按钮后停止。这种模式适合于...

    vb串口通信 vb设计打卡程序 RFID应用上位机开发

    通过对VB程序的不断优化,可以构建出稳定可靠的RFID打卡系统。 总之,VB串口通信和MFRC522的结合,为RFID应用提供了灵活且实用的解决方案。通过VB上位机程序,我们可以方便地控制和管理RFID设备,实现各种应用场景...

    VB编写的 任意函数画图程序

    3. **脚本解释器**:VB程序中可能用到VBScript或JScript等脚本引擎来解析和执行用户输入的函数。例如,使用`ExecuteStatement`或`Run`方法来运行包含函数的字符串。 4. **数学函数解析**:程序需要能理解并解析用户...

    vb串口通信程序

    在VB程序中,我们需要配置MSComm控件的属性,如PortName(指定串口号,如"COM1")、Settings(设定波特率、数据位、校验位和停止位)、InputMode(设置输入模式,如Text或Binary)。然后,我们可以通过CommPort属性...

    VB电源控制的程序

    1. 电压设置:VB程序可以设定电源的输出电压,用户可以通过界面上的输入框或滑动条进行设定,程序则将该值转化为SCPI命令发送给电源设备。 2. 电流限制:为了保护电路,VB程序还允许设置电流上限,一旦超过设定值,...

    VB 字幕板程序 课程设计

    在VB中,我们可以使用TextBox控件接收用户的输入,然后将这些文本信息转化为字幕内容。Label控件则用于显示字幕,通过适时更新Label的Text属性,可以实现字幕的滚动效果。为了实现字幕的连续滚动,通常需要结合Timer...

    VB串口通信源程序代码

    VB串口通信是Visual Basic编程中的一个重要领域,它允许应用程序通过串行端口与外部设备进行数据交换。在本主题中,我们将深入探讨VB串口通信的原理、MSComm控件的应用以及如何利用这些资源来实现串口通信。 首先,...

    VB6.0串口通信实例程序

    《VB6.0串口通信实例程序》是一个利用Visual Basic 6.0(VB6.0)编程环境设计的简单而实用的串行通信应用程序。串口通信在各种硬件设备的连接与数据交换中扮演着重要的角色,尤其在工业自动化、物联网设备、嵌入式...

    十分简单的VB生成验证码程序

    通过设定种子(如当前时间)确保每次运行时生成不同的序列,增加验证码的不可预测性。 2. **字符串操作**:生成的随机数需要转换为字符并组合成字符串。VB中的`CStr`函数可以将数值转换为字符串,`Join`函数可以将...

    S7-200 VB监控程序及VB源码

    【S7-200 VB监控程序及VB源码】是一个专为西门子S7-200系列PLC(可编程逻辑控制器)设计的可视化监控系统,它利用Visual Basic(VB)语言进行开发,提供了实时通讯功能,确保了与PLC之间的稳定交互。在工业自动化...

    VB趣味程序集锦 朱恩源

    《VB趣味程序集锦》是朱恩源先生的一本著作,由上海教育出版社出版,主要针对初学者和爱好者,展示了Visual Basic(VB)编程语言在实际应用中的趣味性和实用性。这本书通过一系列精心设计的程序实例,帮助读者深入...

    STC-51 单片机VB串口通信程序(已测试OK)

    首先,我们需要在VB程序中设置MSComm控件的属性,如ComPort(指定串口号)、InputLen(设定接收缓冲区长度)、Settings(设定通信参数,如9600,N,8,1,表示波特率9600,无校验,8位数据,1位停止位)。然后,我们...

    vb仪表通信程序代码

    6. **错误处理**:在VB通信程序中,要设置适当的错误处理机制,例如使用`On Error`语句,以确保在遇到通信问题时程序能够正常运行。 在`温度控制`这个子文件中,可能包含了与温度相关的仪表通信代码,例如读取温度...

    VB6撞球游戏源程序

    首先,VB6是微软公司推出的一种可视化编程工具,全称为Visual Basic 6.0,它是基于事件驱动的编程语言,适合快速开发Windows应用程序。在这个撞球游戏中,开发者利用VB6的图形用户界面(GUI)组件,如Form,来创建...

    vb 编写的c/s简单通信程序

    VB中,我们同样使用Winsock组件,但需要配置其Listen属性为True,设定LocalPort属性为监听的端口。当有客户端连接时,会触发ServerConnect事件,此时可以创建一个新的线程或线程池处理客户端的请求。接收到数据后,...

Global site tag (gtag.js) - Google Analytics