如何在VB例程中接收自定义消息
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                如何在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
                        
                        
                        您可以用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例程中接收自定义消息的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: CYQ.Data 轻量数据层之路 使用篇
- 下一篇: 云计算的网络规划——私有云
