初学,对sendmessage的了解比较浅,希望高手可以系统的提供关于这个应用的帮助。
比如:
A窗口里有一个Button和一个Edit。
B窗口里也有一个Button和一个Edit。A窗口的Button发送一个字符串给B窗口,B窗口接收到后显示在Edit里,
然后B窗口再发送回给A窗口一个字符串,A窗口显示在自己的Edit里。如果可以再举个用多线程实现此问题的例子更好。
比如:
A窗口里有一个Button和一个Edit。
B窗口里也有一个Button和一个Edit。A窗口的Button发送一个字符串给B窗口,B窗口接收到后显示在Edit里,
然后B窗口再发送回给A窗口一个字符串,A窗口显示在自己的Edit里。如果可以再举个用多线程实现此问题的例子更好。
A窗口的Button发送一个字符串给B窗口,B窗口接收到后显示在Edit里,
不需要使用SendMessage,直接在A窗口内定义FormB.Edit1.Text = FormA.Edit1.Text;在不同进程下:
要实现这样的功能需在A窗口中创建映像文件,然后映射到本进程。
B窗口要打开映像文件,映射到本进程。
三个函数:CreateFileMapping, OpenFileMapping, MapViewOfFile, UnMapViewOfFileA和B窗口中各定义
1、 const WM_MYSENDMSG = WM_USER + 1024;//自定义的消息
2、 type
PShared = ^TShared;
TShared = record
Data: array [0..255] of char;//使用windows标准字符形式char, char *
end;var
Shared: PSharedA窗口中Button事件
var
str: PChar;
begin
str = PChar(Edit1.Text);
CopyMemory(@(Share^.data), str, length(str));
SendMessage(FindWindow(nil, 'B窗口的Caption'), WM_MYSENDMSG, 1, 1));
end;B窗口中定义过程
public
procedure GetFormASendMsg(var msg: TMessage); message WM_MYSENDMSG;//接收并处理WM_MYSENDMSG消息
begin
end;
var
cds: COPYDATASTRUCT;
str: string;
begin
str := ...
cds.cbData := Length(str)+1;
cds.lpData := PChar(str);
SendMessage(self.Handle, WM_COPYDATA, self.Handle, Integer(@cds));
...接收字符串:procedure WMCopyData(var Message: TMessage); message WM_COPYDATA;
...procedure TForm1.WMCopyData(var Message: TMessage);
type
PCOPYDATASTRUCT=^COPYDATASTRUCT;
var
pcds: PCOPYDATASTRUCT;
s: string;
begin
pcds := PCOPYDATASTRUCT(Message.lParam);
s := string(PChar(pcds.lpData));
ShowMessage(s);
end;