`

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源码,多媒体技术,监控录像 VB监控录像程序,捕获视频文件,将捕捉文件保存为另一个用户指定的文件。这个消息不会改变捕捉文件的名字和内容,由于捕捉文件保留它最初的文件名,因此必须指定个新的文件的...

    单片机与vb串口通信

    // 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s // 串口接收中断允许,发送中断禁止 //-------------------------------------------------------------------------------------------------- ...

    VB远程水文监测管理系统源程序

    内容索引:VB源码,网络相关,远程,水文监测,管理系统 VB开发的远程水文监测管理系统源程序,系统参数设定(状态码设定、I/o值设定、电流最大值设定)、数据检测(自动接收数据,请求数据)、数据库管理与查询(查询、...

    API之网络函数---整理网络函数及功能

    GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 PostMessage 将一条消息投递到指定窗口的消息队列 PostThreadMessage 将一条...

    CommTone6串口调试精灵/WEB串口通信

    支持常用的110-115200bps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送任何数据或字符(包括中文),可以任意设定自动发送周期。 新增加发送文件功能,支持超大4GB文件传输。 增加OCX二...

    易语言程序免安装版下载

    修改编译器,可以为编译出的EXE、DLL添加版本信息(通过“程序配置”设定)。 5. 修改集成开发环境,自动记忆非独立编译时是否写出依赖文件的选项。 6. 大幅提高编译速度。 对其它支持库的更新: 1. 修改高级...

    补丁模块(带源码)InlinePatch,Hook,内存DLL注入等等

    可放在程序运行的第一个函数 被调试返回真 .子程序 AntiODMenu, 逻辑型, 公开, 这个效果较好,推荐用这个;找到OD相关句柄返回真, 此函数枚举窗口通过菜单名来 判定是否OD窗口。 .子程序 AntiStrongOD, 逻辑型, ...

    java源码包2

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

    java源码包---java 源码 大量 实例

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

    vc++ 应用源码包_1

    独立打包,保证可解压,内含大量源码,网上搜集而来。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、...

    java源码包3

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

    java源码包4

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

    JAVA上百实例源码以及开源项目源代码

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

    JAVA上百实例源码以及开源项目

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...

    计算机应用技术(实用手册)

    当设定为[Enabled](启动)时,这个项目在系统电源开启之后,可加速POST(Power On Self Test)的程序。BIOS会在POST过程当中缩短或是跳过一些检查项目,从而加速启动等待的时间! Hard Disk Boot Priority(硬盘...

    基于PC机与CPLD通信问题的研究

     用CPLD(复杂可编程逻辑器件)设计乃至仿真、验证、利用ISP(在系统可编程)对硬件调试都非常方便,所以开发周期很短,且I/O口随意设定,故用CPLD设计专用芯片是大势所趋。VB是一种面向对象的语言,应用这的通信...

    EDA/PLD中的基于PC机与CPLD通信问题的研究

     用CPLD(复杂可编程逻辑器件)设计乃至仿真、验证、利用ISP(在系统可编程)对硬件调试都非常方便,所以开发周期很短,且I/O口随意设定,故用CPLD设计专用芯片是大势所趋。VB是一种面向对象的高级语言,应用这的...

Global site tag (gtag.js) - Google Analytics