首 页文章中心下载中心繁體中文
设为首页
加入收藏
联系我们
您当前的位置:开源盛世-源代码下载网 -> 文章中心 -> V B 专区 -> 文章内容 退出登录 用户管理
栏目导航
· VC++专区 · V B 专区
· GIS 专区 · PDA 专区
· 其他编程 · 网站开发类
· 数据库类 · 软件应用
· 网络安全 · 论文专区
· 综合资讯
热门文章
· Tab Control控件使用...
· 学生档案管理系统
· [图文] 排列组合公式
· UTF-8与GB2312之间的...
· DirectShow下载安装...
· Virtual PC 在PAE模...
· Windows2000终端服务...
· MapInfo上的GIS系统...
· Mapbasic参考手册索...
· MapX应用开发中文讲...
相关文章
· 如何在Visual Basic...
· 如何在Visual Basic...
· 如何在vb 中用api函...
· 如何在VB5.0中简单安...
如何在VB例程中接收自定义消息
作者:佚名  来源:vscodes.com整理  发布时间:2005-12-16 13:48:41  发布人:Polaris

减小字体 增大字体

如何在VB例程中接收自定义消息
(录入日期:2002.06.08 阅读次数:2141) 转载不详
作者:不详

如何在VB例程中接收自定义消息


  您可以用API函数SetWindowLong指定处理消息的窗口过程(window procedure)为自定义的函数WindowProc,捕获消息ID为WM_USER+1的自定义消息或系统消息。并且,为了保证窗口能正确的响应消息,需要保存原来默认的窗口过程并在自定义函数WindowProc中调用。如下例,在按钮事件中发送自定义消息,WindowProc捕获了窗口大小变化的系统定义消息和用户自定义的消息并显示用户自定义的消息参数wParam:
在Moduel中加入以下代码,

  Option Explicit
   Private Const GWL_WNDPROC = -4
   Public Const GWL_USERDATA = (-21)
   Public Const WM_SIZE = &H5
   Public Const WM_USER = &H400
   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
  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 "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

  在Form中加入以下代码:

  Dim wParam As Long
  Dim lParam As Long
  Dim lResult As Long
  Private Sub Command1_Click()
   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

  在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 Window注释:s Messages Using AddressOf

   http://support.microsoft.com/support/kb/articles/q168/7/95.asp  

End of《如何在VB例程中接收自定义消息》

[] [返回上一页] [打 印] [收 藏]
上一篇文章:用VB调试串口通讯
 
∷相关“如何在VB例程中接收自定义消息”文章评论∷
(评论内容只代表网友观点,与本站立场无关!) [更多评论...]
  评论人:Lonmmel   打分:85 分  发表时间:2006-1-23 18:25:30
· 不知道会不会引发堆栈溢出的问题。我曾经做过一个hook的代码,但在使用的时候发现会出现堆栈溢出的问题,不知道作者是怎么解...
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 网站目录 鄂ICP备06007162
开源盛世 版权所有Copyright © 2003-2005 VSCodes.Com. All Rights Reserved.