如题,我的程序(VB开发的)要获取别的程序(C)传递过来的消息

解决方案 »

  1.   

    '声明: 
    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则不返回。 '当然这两个函数不仅仅只是发送键位消息,还有很广泛的用途,详细资料网上去找吧。
      

  2.   

    谢谢gralei 这是发送消息,我需要获取消息的代码,我只获取消息
      

  3.   

    PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As LongwParam 
    lParam
    这两个参数中就是消息的数据,你需要转换,同时知道传递的数据的结构等
      

  4.   

    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