Declare Function PostMessageByString& Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String)
那你测试一下, 我在win2000 server ,vb6 测试不成功。
http://www.microsoft.com/msj/1197/win321197.aspx
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
'发送程序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
在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) 这样应该能解决你的问题。如果还不行,那就得问问接受消息的对象到底要接受什么东西了……
看了一下,XP下不行,SendMessage可以。
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 ------------------- 试验代码。
to dongge2000:SendMessage 是可以,我说的PostMessage不行。(其实我用VC PostMessage试了,PostMessage传string 也不行。 另外,用vb 发SendMessage vc窗口,WM_USER+100,0&,ByVal("CSDN")在VC中,自定义消息函数无法接收字符串,不知道怎么转换。
我在win2000 server ,vb6 测试不成功。
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
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
但我还是想搞明白PostMessage发送字符串的程序,因为在VC中,PostMessage 和 SendMessage都是可以发送字符串的,把字符串的地址传给LPARAM就行了,如
PostMessage(HWND,WM_USER+100,0,(LPARAM)(LPCTSTR)"mycaption");
就可以了, 而VB无法传地址,而且LPARAM 定义为Long 楼上的方法太麻烦拉!!!!! 难道VB 就真的无法使用PostMessage传送string吗????????????!!!!!!
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)
这样应该能解决你的问题。如果还不行,那就得问问接受消息的对象到底要接受什么东西了……
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
-------------------
试验代码。
另外,用vb 发SendMessage vc窗口,WM_USER+100,0&,ByVal("CSDN")在VC中,自定义消息函数无法接收字符串,不知道怎么转换。