两 个程序交换数据的问题??

fucool 2002-04-04 09:41:51
我知道可以发送WM_COPYDATA消息传递数据,但不知如何接收?
请大家指教!
谢谢
...全文
51 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingfuhao 2002-04-05
  • 打赏
  • 举报
回复

发送程序:
需要一个form和一个Module

在form中,加一个text控件和一个command控件

代码如下:
Option Explicit
Dim strtext As String
Dim SendData As COPYDATASTRUCT

Private Sub Command1_Click()

Dim hwnd As Long

strtext = Text1.Text

SendData.dwData = 32
SendData.cbData = LenB(strtext)
SendData.lpData = StrPtr(strtext)

hwnd = FindWindow(vbNullString, "测试程序")

Call SendMessage(hwnd, WM_COPYDATA, Me.hwnd, SendData)

End Sub

在module中:

Option Explicit

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const WM_COPYDATA = &H4A

Public Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End Type


接收端:
一个Form和一个module

在Form中需要一个text控件

代码如下:
Option Explicit

Private Sub Form_Load()
'Subclass this form
HookForm Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
'Unhook the form
UnHookForm Me
End Sub


在module中代码:

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong 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
Public Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Const GWL_WNDPROC = (-4)
Dim PrevProc As Long
Public Const WM_COPYDATA = &H4A

Public Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End Type

Dim p As COPYDATASTRUCT

Public Sub HookForm(F As Form)
PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHookForm(F As Form)
SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc
End Sub
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Dim strreceive As String
If uMsg = WM_COPYDATA Then
strreceive = Space(256)
CopyMemory p, ByVal lParam, Len(p)
CopyMemory ByVal StrPtr(strreceive), ByVal p.lpData, p.cbData

Form1.Text1.Text = Trim(strreceive)
End If

WindowProc = DefWindowProc(hwnd, uMsg, wParam, lParam)

End Function
dingfuhao 2002-04-04
  • 打赏
  • 举报
回复
WM_COPYDATA
wParam = (WPARAM) (HWND) hwnd; // handle of sending window
lParam = (LPARAM) (PCOPYDATASTRUCT)


消息的lparam保存的是个COPYDATASTRUCT结构

copydatastruct结构为

typedef struct tagCOPYDATASTRUCT { // cds
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;

cbdate表示lpdate指向的数据的size
lpData表示传递给接收程序的数据指针

在接收时,定义一个COPYDATASTRUCT类型的标量

处理WM_COPYDATA消息

就可以获得数据了

fucool 2002-04-04
  • 打赏
  • 举报
回复
能不能给个实例???

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧