由于SendMessaeg是要等到消息处理函数返回后才返回,而PostMessage就不用。但有一个问题,lParam as long,lParam 如何发送string ,急!急!急!急!请各位高手赶快指点,先谢谢拉

解决方案 »

  1.   

    Declare Function PostMessageByString& Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String)
      

  2.   

    那你测试一下,
    我在win2000 server ,vb6 测试不成功。
      

  3.   

    http://www.microsoft.com/msj/1197/win321197.aspx
      

  4.   

    Public Type STARTUPINFO
       cb As Long
       lpReserved As String
       lpDesktop As String
       lpTitle As String
       dwX As Long
       dwY As Long
       dwXSize As Long
       dwYSize As Long
       dwXCountChars As Long
       dwYCountChars As Long
       dwFillAttribute As Long
       dwFlags As Long
       wShowWindow As Integer
       cbReserved2 As Integer
       lpReserved2 As Long
       hStdInput As Long
       hStdOutput As Long
       hStdError As Long
    End TypePublic Type PROCESS_INFORMATION
       hProcess As Long
       hThread As Long
       dwProcessID As Long
       dwThreadID As Long
    End TypePublic Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
       hHandle As Long, ByVal dwMilliseconds As Long) As LongPublic Declare Function CreateProcessA Lib "kernel32" (ByVal _
       lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
       lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
       ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
       ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
       lpStartupInfo As STARTUPINFO, lpProcessInformation As _
       PROCESS_INFORMATION) As LongPublic Declare Function CloseHandle Lib "kernel32" (ByVal _
       hObject As Long) As LongPublic Const NORMAL_PRIORITY_CLASS = &H20&
    Public Const INFINITE = -1&
    Type COPYDATASTRUCT
        dwData As Long
        cbData As Long
        lpData As Long
    End TypePublic Const WM_COPYDATA = &H4A
    Public Const GWL_WNDPROC = (-4)Global lpPrevWndProc As Long
    Global gHW As Long'Copies a block of memory from one location to another.
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
       (hpvDest As Any, hpvSource As Any, ByVal cbCopy 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 LongDeclare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" _
       (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As _
       Long) As LongPublic Sub Hook()
        lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
        AddressOf WindowProc)
    End SubPublic Sub Unhook()
        Dim temp As Long
        temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
    End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
                    ByVal wParam As Long, ByVal lParam As Long) As Long    Select Case uMsg
            Case WM_COPYDATA
                Call mySub(wParam, lParam)
        End Select    WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, _
           lParam)
    End FunctionSub mySub(wParam As Long, lParam As Long)
        Dim cds As COPYDATASTRUCT
        Dim Buf(1 To 255) As Byte
        Dim a As String
        
        Call CopyMemory(cds, ByVal lParam, Len(cds))    Select Case cds.dwData
         Case 1
         Case 2
         Case 3
            Call CopyMemory(Buf(1), ByVal cds.lpData, cds.cbData)
            a = StrConv(Buf, vbUnicode)
            a = Left$(a, InStr(1, a, Chr$(0)) - 1)
            frmMain.transactMsg wParam, a
        End Select
    End Sub
      

  5.   

    '发送程序Private Sub SendMsg(a As String)
        Dim cds As COPYDATASTRUCT
        Dim ThWnd As Long
        Dim buf(1 To 255) As Byte
        Dim i As Long
        
    ' Get the hWnd of the target application
        ThWnd = FindWindow(vbNullString, "接收程序标题")
    ' Copy the string into a byte array, converting it to ASCII
        Call CopyMemory(buf(1), ByVal a$, Len(a$))
        cds.dwData = 3
        cds.cbData = Len(a$) + 1
        cds.lpData = VarPtr(buf(1))
        i = SendMessage(ThWnd, WM_COPYDATA, Me.hwnd, cds)
    End Sub
      

  6.   

    to  zyp2kyear(E腾鸟) :谢谢!
    但我还是想搞明白PostMessage发送字符串的程序,因为在VC中,PostMessage 和 SendMessage都是可以发送字符串的,把字符串的地址传给LPARAM就行了,如
       PostMessage(HWND,WM_USER+100,0,(LPARAM)(LPCTSTR)"mycaption");
    就可以了,  而VB无法传地址,而且LPARAM 定义为Long  楼上的方法太麻烦拉!!!!!  难道VB 就真的无法使用PostMessage传送string吗????????????!!!!!!
      

  7.   

    在postmessage函数原型里lparam实际上并没有特别限定为string或者long或者其它的:
    BOOL PostMessage(
      HWND hWnd,      // handle to destination window
      UINT Msg,       // message
      WPARAM wParam,  // first message parameter
      LPARAM lParam   // second message parameter
    );
    只不过在VB中的声明不同罢了。最通用的办法是声明为
    Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Variant, ByVal lParam As Variant)
    这样应该能解决你的问题。如果还不行,那就得问问接受消息的对象到底要接受什么东西了……
      

  8.   

    看了一下,XP下不行,SendMessage可以。
      

  9.   

    Option Explicit
    Private Const WM_SETTEXT = &HC
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As String) As Long
    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As String) As LongPrivate Sub Command1_Click()
        SendMessage Me.hwnd, WM_SETTEXT, 0&, ByVal ("CSDN")
    End Sub
    -------------------
    试验代码。
      

  10.   

    to dongge2000:SendMessage 是可以,我说的PostMessage不行。(其实我用VC PostMessage试了,PostMessage传string 也不行。
    另外,用vb 发SendMessage vc窗口,WM_USER+100,0&,ByVal("CSDN")在VC中,自定义消息函数无法接收字符串,不知道怎么转换。