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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

VB为自己的程序设定消息(可接收处理)

發布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VB为自己的程序设定消息(可接收处理) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

VB為自己的程序設定消息(可接收處理)

Posted by JiaJia 5 March,2009 (0)Comment   用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为自己的程序设定消息(可接收处理)的全部內容,希望文章能夠幫你解決所遇到的問題。

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