两个程序之间如何发送、接收消息?
制作两个程序,一个程序上面只有一个按钮,另一个程序上面只有一个TMemo控件,编译两个程序,然后先运行只有TMemo控件的那个程序,然后再运行只有TButton控件的那个程序,怎么做才可以让TButton控件按下时TMemo控件中的文本变为指定的文本,如"hello World!"? 问题点数:100、回复次数:20Top
1 楼comsun(comsun)回复于 2001-05-23 01:13:00 得分 0
使用 ServerSocket 和 ClientSocket 进行连接,发送字符串即可。或者使用 NMUDP 控件发送也很好。这是在远程或本地机都可以的方法。要是本地机,直接使用共享内存的方法,看看CreateSharedMemory 函数的说明吧。Top
2 楼rh(花覆茅檐)回复于 2001-05-23 01:14:00 得分 0
你可以setwindowtext
你可以sendmessageTop
3 楼BigBen(江南草)回复于 2001-05-23 08:07:00 得分 0
form2.button1click(sender:TObject);
begin
sendmessage(findwindowEx(findwindow('tform1','form1'),0,'tmemo1','memo1'),
wm_settext,0,'hello,World!');
end;Top
4 楼Kingron(单身走我路……)回复于 2001-05-23 08:43:00 得分 0
呵呵,很多的方法,用消息可以,DDE也可以,共享内存也可以,用WM_SetTEXT也可以.....Top
5 楼richboy(凡俊)回复于 2001-05-23 12:38:00 得分 0
为什么BigBen(江南草) 的代码运行完出现Incompatible types:'Integer' and 'String'错误?Top
6 楼richboy(凡俊)回复于 2001-05-23 15:09:00 得分 0
大家帮帮忙!谢谢!Top
7 楼shuyi(舒易)回复于 2001-05-23 15:13:00 得分 0
最省事的方法是共用ini文件Top
8 楼richboy(凡俊)回复于 2001-05-23 15:14:00 得分 0
是向Memo发送指定的字符,并不是从INI加载。Top
9 楼kingsong(牛大锅)回复于 2001-05-23 15:37:00 得分 0
...Top
10 楼Kingron(单身走我路……)回复于 2001-05-23 15:40:00 得分 0
'hello,World!'改成integer(pchar('Hello,World!'))就可以了.Top
11 楼richboy(凡俊)回复于 2001-05-23 23:26:00 得分 0
sendmessage(findwindowEx(findwindow('TForm1','Form1'),0,'tmemo1','memo1'),
wm_settext,0,integer(pchar('helloWorld!')));
用上面的代码无法实现,大虾请赐教!Top
12 楼summernightrain(夏夜雨)回复于 2001-05-24 00:29:00 得分 0
你要传字符串就用共享内存好了。
Top
13 楼summernightrain(夏夜雨)回复于 2001-05-24 00:34:00 得分 0
具体方法是:
一个程序改了一块共享内存后再发消息给另一个程序。。
1。改共享内存。
2。postmessage(handle,WM_USER(自定义),0,0)
另一个程序收到消息后再去都这块内存。
再窗口中添加过程,
procedure RecvMsg(Msg:TMessage);message WM_USER;
再这个过程中去查询那个内存的值。。。Top
14 楼richboy(凡俊)回复于 2001-05-24 08:31:00 得分 0
具体点的例子?有没有呀?Top
15 楼summernightrain(夏夜雨)回复于 2001-05-25 11:07:00 得分 0
你想要例子,我可以编一个,把你的油箱告诉我。Top
16 楼richboy(凡俊)回复于 2001-05-25 16:54:00 得分 0
我的邮箱richboys@21cn.com,谢谢!Top
17 楼summernightrain(夏夜雨)回复于 2001-05-26 13:35:00 得分 0
你要例子我已经发了!!!Top
18 楼summernightrain(夏夜雨)回复于 2001-05-26 13:41:00 得分 100
这里我再把我的代码关键的部分拿出来,欢迎大家批评指正....
这是发送的部分:
主窗口上包含两个Button ,一个输入Edit1,一个提示Label.
procedure TfrmSendMsg.Button1Click(Sender: TObject);
var
Win:HWND;
Post:Pointer;
pStr:PShortString;
Str:String;
begin
Str:=Edit1.Text;
MapHandle:=CreateFileMapping(DWord(-1),nil,PAGE_READWRITE,0,250,'summer');
if (MapHandle>0) then
begin
Post:=MapViewOfFile(MapHandle,FILE_MAP_WRITE,0,0,0);
pStr:=Post;
pStr^:=Str; //写共享内存
end;
Win:=FindWindow('TfrmRecvMsg',nil);
If Win>0 then
Begin
PostMessage(Win,WM_USER+100,0,0); //发消息给接收程序的主窗口...
Edit1.SetFocus;
Label2.Caption:='发送完成!';
end
Else
Begin
Label2.Caption:='接收器没有运行!';
end;
end;
这是接收部分:
主窗口包含一个Memo1.
unit RecvMsg;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TfrmRecvMsg = class(TForm)
Memo1: TMemo;
Label1: TLabel;
private
procedure GetMsg(var Msg: TMessage);Message WM_USER+100; //在这里增加接收的过程
{ Private declarations }
public
{ Public declarations }
end;
var
frmRecvMsg: TfrmRecvMsg;
implementation
{$R *.DFM}
{ TfrmRecvMsg }
procedure TfrmRecvMsg.GetMsg(var Msg: TMessage);
var
MapHandle:THandle;
pStr:Pointer;
Str:String;
begin
MapHandle:=CreateFileMapping(DWord(-1),nil,PAGE_READWRITE,0,255,'summer');
if (MapHandle>0) then
begin
pStr:=MapViewOfFile(MapHandle,FILE_MAP_READ,0,0,10); //得到共享内存的指针
Memo1.Lines.Add('收到一条消息!!');
Memo1.Lines.Add(Pchar(pStr));
end;
CloseHandle(MapHandle);
end;
end.
Top
19 楼richboy(凡俊)回复于 2001-05-26 17:28:00 得分 0
谢谢大家!感谢summernightrain(夏夜雨)我已经收到你的邮件了,谢谢!Top
20 楼fuyuan_cao(CFY)回复于 2001-08-15 09:38:40 得分 0
gzTop




