VB为自己的程序设定消息(可接收处理)
生活随笔
收集整理的這篇文章主要介紹了
VB为自己的程序设定消息(可接收处理)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
VB為自己的程序設(shè)定消息(可接收處理)
Posted by JiaJia 5 March,2009 (0)Comment 用API函數(shù) SetWindowLong 指定處理消息的窗口過程為自定義的函數(shù) WindowProc,捕獲消息ID為 WM_USER+1 的自定義消息或系統(tǒng)消息。并且,為了保證窗口能正確的響應(yīng)消息,需要保存原來默認(rèn)的窗口過程并在自定義函數(shù)WindowProc中調(diào)用。如下例,在按鈕事件中發(fā)送自定義消息,WindowProc 捕獲了窗口大小變化的系統(tǒng)定義消息和用戶自定義的消息并顯示用戶自定義的消息參數(shù) 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)
'保存原來默認(rèn)的窗口過程指針
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
'查詢?cè)瓉砟J(rèn)的窗口過程指針
lpPrevWndProc = GetWindowLong(hw, GWL_USERDATA)
'調(diào)用原來的窗口過程
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg,wParam, lParam)
End Function
在VB中用自定義過程捕獲并處理消息的詳細(xì)信息和例子請(qǐng)參考:
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
總結(jié)
以上是生活随笔為你收集整理的VB为自己的程序设定消息(可接收处理)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VB 长整型和字节数组的转换问题 (Lo
- 下一篇: Access 和 SQL 数据类型的比较