日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/6/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在VB例程中接收自定义消息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼如何在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


總結

以上是生活随笔為你收集整理的如何在VB例程中接收自定义消息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。