消息发送:
procedure TClient.Button1Click(Sender: TObject);
var WindowName:string;
Hwd:HWND; //窗体句柄类型
begin
WindowName:='Server';
Hwd:=FindWindow(nil,PWideChar(windowname));
if(Hwd=0)then
begin
ShowMessage('句柄没找到!');
exit;
end;
if(Edit1.Text<>'')then
begin
SendMessageTo(Hwd,edit1.Text);
end;
end;procedure TClient.SendMessageTo(Hwd: HWND; var SendStr: string);
var DataStruct:TCopyDataStruct;
begin
DataStruct.dwData:=0;
DataStruct.cbData:=0;
DataStruct.lpData:=@SendStr;
SendMessage(Hwd,WM_COPYDATA,0,LongInt(@DataStruct));
end;接收:
procedure TForm2.WMCopyData(var M: TMessage);
var CopyData:TCopyDataStruct;
msgstr:string;
begin
CopyData:=TCopyDataStruct(Pointer(m.LParam)^);
msgstr:=string(PChar(Pointer(CopyData.lpData)^));
ShowMessage(msgstr);
end;接收端接收的数据全是乱码,不知道怎么搞的,请大神帮忙看看
procedure TClient.Button1Click(Sender: TObject);
var WindowName:string;
Hwd:HWND; //窗体句柄类型
begin
WindowName:='Server';
Hwd:=FindWindow(nil,PWideChar(windowname));
if(Hwd=0)then
begin
ShowMessage('句柄没找到!');
exit;
end;
if(Edit1.Text<>'')then
begin
SendMessageTo(Hwd,edit1.Text);
end;
end;procedure TClient.SendMessageTo(Hwd: HWND; var SendStr: string);
var DataStruct:TCopyDataStruct;
begin
DataStruct.dwData:=0;
DataStruct.cbData:=0;
DataStruct.lpData:=@SendStr;
SendMessage(Hwd,WM_COPYDATA,0,LongInt(@DataStruct));
end;接收:
procedure TForm2.WMCopyData(var M: TMessage);
var CopyData:TCopyDataStruct;
msgstr:string;
begin
CopyData:=TCopyDataStruct(Pointer(m.LParam)^);
msgstr:=string(PChar(Pointer(CopyData.lpData)^));
ShowMessage(msgstr);
end;接收端接收的数据全是乱码,不知道怎么搞的,请大神帮忙看看
消息发送:
procedure SendMessageTo(Hwd: HWND; var SendStr: string);
....procedure TForm1.btn1Click(Sender: TObject);
var
WindowName: string;
Hwd: HWND; //窗体句柄类型
data: string;
begin
WindowName := 'form2';
Hwd := FindWindow(nil, PChar(windowname));
if (Hwd = 0) then
begin
ShowMessage('句柄没找到!');
exit;
end;
if (edt1.Text <> '') then
begin
data := edt1.Text;
SendMessageTo(Hwd, data);
end;
end;procedure TForm1.SendMessageTo(Hwd: HWND; var SendStr: string);
var
DataStruct: TCopyDataStruct;
data: PChar;
dataSize: Integer;
begin
data := StrAlloc(Length(SendStr) + 1);
dataSize := StrBufSize(data);
ZeroMemory(data, dataSize);
CopyMemory(data,@SendStr[1],dataSize);
DataStruct.dwData := WM_COPYDATA;
DataStruct.cbData := dataSize;
DataStruct.lpData := data;
SendMessage(Hwd, WM_COPYDATA, 0, LongInt(@DataStruct));
StrDispose(data);
end;
接收:procedure WMCopyData(var M: TWMCopyData); message WM_COPYDATA;
....procedure TForm2.WMCopyData(var M: TWMCopyData);
begin
edt1.Text := PChar(M.CopyDataStruct.lpData);
end;
DataStruct.cbData 传送数据的长度,字节为单位
DataStruct.lpData 指针类型数据,可以为空
这类问题其实看一下MSDN就有答案了嘛,如果不会英文就有道词典啊,
长篇大论不行,看几个单词怎么也不会有问题嘛COPYDATASTRUCT Structure--------------------------------------------------------------------------------The COPYDATASTRUCT structure contains data to be passed to another application by the WM_COPYDATA message. Syntaxtypedef struct tagCOPYDATASTRUCT {
ULONG_PTR dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
MembersdwData
Specifies data to be passed to the receiving application.
cbData
Specifies the size, in bytes, of the data pointed to by the lpData member.
lpData
Pointer to data to be passed to the receiving application. This member can be NULL.
msgstr:=string(PChar(Pointer(CopyData.lpData)^))类型转换出问题了
msgstr:=string(PChar(Pointer(CopyData.lpData)^))类型转换出问题了不可以直接读到其他程式的内存数据,除非有注入到其他程式的内部。
多了个^
msgstr:=string(PChar(Pointer(CopyData.lpData)^))类型转换出问题了不可以直接读到其他程式的内存数据,除非有注入到其他程式的内部。真的吗?
它只是把两个程序的内存块相互复制.
可以看Windows源代码,底层是ReadProcessMemory实现的.