'声明: Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ======== '以下是键位的静态变量声明: Public Const WM_KEYDOWN = &H100 '按下键位 Public Const WM_KEYUP = &H101 '弹起键位 Public Const WM_CHAR = &H102 '清除键位 Public Const WM_SYSKEYDOWN = &H103 '按下系统键位 Public Const WM_SYSKEYUP = &H104 '弹起系统键位 Public Const WM_USER = &H400 '具体键位 Public Const VK_LBUTTON = &H1 Public Const VK_RBUTTON = &H2 Public Const VK_CTRLBREAK = &H3 Public Const VK_MBUTTON = &H4 Public Const VK_BACKSPACE = &H8 Public Const VK_TAB = &H9 Public Const VK_ENTER = &HD Public Const VK_SHIFT = &H10 Public Const VK_CONTROL = &H11 Public Const VK_ALT = &H12 Public Const VK_PAUSE = &H13 Public Const VK_CAPSLOCK = &H14 Public Const VK_ESCAPE = &H1B Public Const VK_SPACE = &H20 Public Const VK_PAGEUP = &H21 Public Const VK_PAGEDOWN = &H22 Public Const VK_END = &H23 Public Const VK_HOME = &H24 Public Const VK_LEFT = &H25 Public Const VK_UP = &H26 Public Const VK_RIGHT = &H27 Public Const VK_DOWN = &H28 Public Const VK_PRINTSCREEN = &H2C Public Const VK_INSERT = &H2D Public Const VK_DELETE = &H2E Public Const VK_0 = &H30 Public Const VK_1 = &H31 Public Const VK_2 = &H32 Public Const VK_3 = &H33 Public Const VK_4 = &H34 Public Const VK_5 = &H35 Public Const VK_6 = &H36 Public Const VK_7 = &H37 Public Const VK_8 = &H38 Public Const VK_9 = &H39 Public Const VK_A = &H41 Public Const VK_B = &H42 Public Const VK_C = &H43 Public Const VK_D = &H44 Public Const VK_E = &H45 Public Const VK_F = &H46 Public Const VK_G = &H47 Public Const VK_H = &H48 Public Const VK_I = &H49 Public Const VK_J = &H4A Public Const VK_K = &H4B Public Const VK_L = &H4C Public Const VK_M = &H4D Public Const VK_N = &H4E Public Const VK_O = &H4F Public Const VK_P = &H50 Public Const VK_Q = &H51 Public Const VK_R = &H52 Public Const VK_S = &H53 Public Const VK_T = &H54 Public Const VK_U = &H55 Public Const VK_V = &H56 Public Const VK_W = &H57 Public Const VK_X = &H58 Public Const VK_Y = &H59 Public Const VK_Z = &H5A Public Const VK_LWINDOWS = &H5B Public Const VK_RWINDOWS = &H5C Public Const VK_APPSPOPUP = &H5D Public Const VK_NUMPAD_0 = &H60 Public Const VK_NUMPAD_1 = &H61 Public Const VK_NUMPAD_2 = &H62 Public Const VK_NUMPAD_3 = &H63 Public Const VK_NUMPAD_4 = &H64 Public Const VK_NUMPAD_5 = &H65 Public Const VK_NUMPAD_6 = &H66 Public Const VK_NUMPAD_7 = &H67 Public Const VK_NUMPAD_8 = &H68 Public Const VK_NUMPAD_9 = &H69 Public Const VK_NUMPAD_MULTIPLY = &H6A Public Const VK_NUMPAD_ADD = &H6B Public Const VK_NUMPAD_PLUS = &H6B Public Const VK_NUMPAD_SUBTRACT = &H6D Public Const VK_NUMPAD_MINUS = &H6D Public Const VK_NUMPAD_MOINS = &H6D Public Const VK_NUMPAD_DECIMAL = &H6E Public Const VK_NUMPAD_POINT = &H6E Public Const VK_NUMPAD_DIVIDE = &H6F Public Const VK_F1 = &H70 Public Const VK_F2 = &H71 Public Const VK_F3 = &H72 Public Const VK_F4 = &H73 Public Const VK_F5 = &H74 Public Const VK_F6 = &H75 Public Const VK_F7 = &H76 Public Const VK_F8 = &H77 Public Const VK_F9 = &H78 Public Const VK_F10 = &H79 Public Const VK_F11 = &H7A Public Const VK_F12 = &H7B Public Const VK_NUMLOCK = &H90 Public Const VK_SCROLL = &H91 Public Const VK_LSHIFT = &HA0 Public Const VK_RSHIFT = &HA1 Public Const VK_LCONTROL = &HA2 Public Const VK_RCONTROL = &HA3 Public Const VK_LALT = &HA4 Public Const VK_RALT = &HA5 Public Const VK_POINTVIRGULE = &HBA '例如:我要发“A”的按键信息给程序二窗体(窗口标题为"P2"),则写入以下: '--------------------------- SendMessage FindWindow(vbNullString, "P2"), WM_KEYDOWN, VK_A, 0& SendMessage FindWindow(vbNullString, "P2"), WM_KEYUP, VK_A, 0& '--------------------------- '多数情况下,我们不是将信息发送给窗体,而已发送给窗体的控件。因为窗体中通常含有多个控件,给控件发送信息就要得到相应控件的句柄,那得看你自己怎么办了。 'FindWindow(vbNullString, "P2") 是得到窗口标题为"P2"的窗口句柄。 '补充声明(用于得到窗口句柄和控件句柄): Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long 'POSTMESSAGE与SENDMESSAGE不同之处在于,SENDMESSAGE发送信息给程序后要返回一些数据,而POSTMESSAGE则不返回。 '当然这两个函数不仅仅只是发送键位消息,还有很广泛的用途,详细资料网上去找吧。
谢谢gralei 这是发送消息,我需要获取消息的代码,我只获取消息
PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As LongwParam lParam 这两个参数中就是消息的数据,你需要转换,同时知道传递的数据的结构等
Option ExplicitPrivate Declare Function lstrcpyn Lib "kernel32.dll" Alias "lstrcpynA" ( _ ByRef lpString1 As Any, _ ByRef lpString2 As Any, _ ByVal iMaxLength As Long) As Long Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" ( _ ByRef lpString As Any) As Long Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongW" ( _ ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcW" ( _ ByVal lpPrevWndFunc As Long, _ ByVal hwnd As Long, _ ByVal msg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long
Private Const GWL_WNDPROC As Long = -4 Private Const WM_SEND = &HXXXX '<-这是约定的消息 Private lpPrevWndProc As LongPublic Sub Attach(ByVal hwnd As Long)'绑定接收 If lpPrevWndProc = 0 Then lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc) End If End SubPublic Sub Detach(ByVal hwnd As Long)'解除接收 If lpPrevWndProc <> 0 Then Call SetWindowLong(hwnd, GWL_WNDPROC, lpPrevWndProc) lpPrevWndProc = 0 End If End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim lLen As Long, a() As Byte If (uMsg = WM_SEND) Then '假定 wParam 为约定的 char* 指针 lLen = lstrlen(ByVal wParam) ReDim a(lLen) lstrcpyn a(0), ByVal wParam, lLen + 1 ReDim Preserve a(lLen - 1) Debug.Print StrConv(a, vbUnicode) End If WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) End Function
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ======== '以下是键位的静态变量声明:
Public Const WM_KEYDOWN = &H100 '按下键位
Public Const WM_KEYUP = &H101 '弹起键位
Public Const WM_CHAR = &H102 '清除键位
Public Const WM_SYSKEYDOWN = &H103 '按下系统键位
Public Const WM_SYSKEYUP = &H104 '弹起系统键位
Public Const WM_USER = &H400
'具体键位
Public Const VK_LBUTTON = &H1
Public Const VK_RBUTTON = &H2
Public Const VK_CTRLBREAK = &H3
Public Const VK_MBUTTON = &H4
Public Const VK_BACKSPACE = &H8
Public Const VK_TAB = &H9
Public Const VK_ENTER = &HD
Public Const VK_SHIFT = &H10
Public Const VK_CONTROL = &H11
Public Const VK_ALT = &H12
Public Const VK_PAUSE = &H13
Public Const VK_CAPSLOCK = &H14
Public Const VK_ESCAPE = &H1B
Public Const VK_SPACE = &H20
Public Const VK_PAGEUP = &H21
Public Const VK_PAGEDOWN = &H22
Public Const VK_END = &H23
Public Const VK_HOME = &H24
Public Const VK_LEFT = &H25
Public Const VK_UP = &H26
Public Const VK_RIGHT = &H27
Public Const VK_DOWN = &H28
Public Const VK_PRINTSCREEN = &H2C
Public Const VK_INSERT = &H2D
Public Const VK_DELETE = &H2E
Public Const VK_0 = &H30
Public Const VK_1 = &H31
Public Const VK_2 = &H32
Public Const VK_3 = &H33
Public Const VK_4 = &H34
Public Const VK_5 = &H35
Public Const VK_6 = &H36
Public Const VK_7 = &H37
Public Const VK_8 = &H38
Public Const VK_9 = &H39
Public Const VK_A = &H41
Public Const VK_B = &H42
Public Const VK_C = &H43
Public Const VK_D = &H44
Public Const VK_E = &H45
Public Const VK_F = &H46
Public Const VK_G = &H47
Public Const VK_H = &H48
Public Const VK_I = &H49
Public Const VK_J = &H4A
Public Const VK_K = &H4B
Public Const VK_L = &H4C
Public Const VK_M = &H4D
Public Const VK_N = &H4E
Public Const VK_O = &H4F
Public Const VK_P = &H50
Public Const VK_Q = &H51
Public Const VK_R = &H52
Public Const VK_S = &H53
Public Const VK_T = &H54
Public Const VK_U = &H55
Public Const VK_V = &H56
Public Const VK_W = &H57
Public Const VK_X = &H58
Public Const VK_Y = &H59
Public Const VK_Z = &H5A
Public Const VK_LWINDOWS = &H5B
Public Const VK_RWINDOWS = &H5C
Public Const VK_APPSPOPUP = &H5D
Public Const VK_NUMPAD_0 = &H60
Public Const VK_NUMPAD_1 = &H61
Public Const VK_NUMPAD_2 = &H62
Public Const VK_NUMPAD_3 = &H63
Public Const VK_NUMPAD_4 = &H64
Public Const VK_NUMPAD_5 = &H65
Public Const VK_NUMPAD_6 = &H66
Public Const VK_NUMPAD_7 = &H67
Public Const VK_NUMPAD_8 = &H68
Public Const VK_NUMPAD_9 = &H69
Public Const VK_NUMPAD_MULTIPLY = &H6A
Public Const VK_NUMPAD_ADD = &H6B
Public Const VK_NUMPAD_PLUS = &H6B
Public Const VK_NUMPAD_SUBTRACT = &H6D
Public Const VK_NUMPAD_MINUS = &H6D
Public Const VK_NUMPAD_MOINS = &H6D
Public Const VK_NUMPAD_DECIMAL = &H6E
Public Const VK_NUMPAD_POINT = &H6E
Public Const VK_NUMPAD_DIVIDE = &H6F
Public Const VK_F1 = &H70
Public Const VK_F2 = &H71
Public Const VK_F3 = &H72
Public Const VK_F4 = &H73
Public Const VK_F5 = &H74
Public Const VK_F6 = &H75
Public Const VK_F7 = &H76
Public Const VK_F8 = &H77
Public Const VK_F9 = &H78
Public Const VK_F10 = &H79
Public Const VK_F11 = &H7A
Public Const VK_F12 = &H7B
Public Const VK_NUMLOCK = &H90
Public Const VK_SCROLL = &H91
Public Const VK_LSHIFT = &HA0
Public Const VK_RSHIFT = &HA1
Public Const VK_LCONTROL = &HA2
Public Const VK_RCONTROL = &HA3
Public Const VK_LALT = &HA4
Public Const VK_RALT = &HA5
Public Const VK_POINTVIRGULE = &HBA
'例如:我要发“A”的按键信息给程序二窗体(窗口标题为"P2"),则写入以下:
'---------------------------
SendMessage FindWindow(vbNullString, "P2"), WM_KEYDOWN, VK_A, 0&
SendMessage FindWindow(vbNullString, "P2"), WM_KEYUP, VK_A, 0&
'--------------------------- '多数情况下,我们不是将信息发送给窗体,而已发送给窗体的控件。因为窗体中通常含有多个控件,给控件发送信息就要得到相应控件的句柄,那得看你自己怎么办了。 'FindWindow(vbNullString, "P2") 是得到窗口标题为"P2"的窗口句柄。 '补充声明(用于得到窗口句柄和控件句柄):
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
'POSTMESSAGE与SENDMESSAGE不同之处在于,SENDMESSAGE发送信息给程序后要返回一些数据,而POSTMESSAGE则不返回。 '当然这两个函数不仅仅只是发送键位消息,还有很广泛的用途,详细资料网上去找吧。
lParam
这两个参数中就是消息的数据,你需要转换,同时知道传递的数据的结构等
ByRef lpString1 As Any, _
ByRef lpString2 As Any, _
ByVal iMaxLength As Long) As Long
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" ( _
ByRef lpString As Any) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongW" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcW" ( _
ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Const GWL_WNDPROC As Long = -4
Private Const WM_SEND = &HXXXX '<-这是约定的消息
Private lpPrevWndProc As LongPublic Sub Attach(ByVal hwnd As Long)'绑定接收
If lpPrevWndProc = 0 Then
lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End If
End SubPublic Sub Detach(ByVal hwnd As Long)'解除接收
If lpPrevWndProc <> 0 Then
Call SetWindowLong(hwnd, GWL_WNDPROC, lpPrevWndProc)
lpPrevWndProc = 0
End If
End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lLen As Long, a() As Byte
If (uMsg = WM_SEND) Then
'假定 wParam 为约定的 char* 指针
lLen = lstrlen(ByVal wParam)
ReDim a(lLen)
lstrcpyn a(0), ByVal wParam, lLen + 1
ReDim Preserve a(lLen - 1)
Debug.Print StrConv(a, vbUnicode)
End If
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function