一个窗体,一个模块:
窗体(两个按钮,一个textbox):
Option Explicit
Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Private Sub Command1_Click()
Dim i As Long
If VBA.IsNumeric(Text1.Text) = False Then
MsgBox "TextBox中只能输入整数,若想输入任意字符,最简单的就是利用剪贴板,不过,还是建议自行研究存储器公用"
Exit Sub
End If
i = CLng(Text1.Text)
Call BroadcastSystemMessage(BSF_POSTMESSAGE, BSM_APPLICATIONS, WM_TEST, 0&, ByVal i)
End Sub
Private Sub Command2_Click()
Text1.Text = mNumber
End Sub
Private Sub Form_Load()
WM_TEST = RegisterWindowMessage("hello")
Command1.Caption = "Set Number"
Command2.Caption = " Get Number"
Text1.Text = ""
Hook Me.hwnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnHook Me.hwnd
End Sub
模块:
Option Explicit
Public Const BSF_POSTMESSAGE = &H10
Public Const BSM_APPLICATIONS = &H8
Public Const GWL_WNDPROC = -4
Public Declare Function BroadcastSystemMessage Lib "user32" (ByVal dw As Long, pdw As Long, ByVal un As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
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
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public mNumber As Long
Global lpPrevWndProc As Long
Public WM_TEST As Long
Public Sub Hook(ByVal hwnd As Long)
lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHook(ByVal hwnd As Long)
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, lpPrevWndProc)
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_TEST Then
mNumber = lparam
Else
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lparam)
End If
End Function