我有两个消息传递问题,请各位帮帮忙,我只有150,全部奉上!(150分)

  • 主题发起人 主题发起人 木工
  • 开始时间 开始时间

木工

Unregistered / Unconfirmed
GUEST, unregistred user!
1。如何在两个不同的进程之间发送消息?<br>2。如何提示消息到达某个窗体(delphi)?我也说不清楚。举个例子吧:<br>&nbsp; 比如我建了两个project,一个做计划,一个做批准。现在我做完一个计划,要发送消息<br>到另外一个project的某个窗体,告诉它计划来了,让它批准。当然,也有可能没有被批准,<br>于是处理完后,可能发回消息,告知计划被批准,或需要修改,或删除。计划员要根据消息<br>的内容进行相应的修改。这样的消息传递如何进行?有没有办法让我在这个进程的某个窗体<br>中发送消息到另一个进程的某个窗体时,那个窗体显示一个消息框,说明消息的内容。<br>&nbsp; 请各位帮帮忙,我只有150,全部奉上!
 
l 利用WM_COPYDATA消息<br>使用该消息涉及一个TcopyDataStruct结构类型的指针。该结构中有三个成员:<br>dwData 是一个32位的附加参数<br>cbData 表示要传递的数据区的大小<br>lpData 表示要传递的数据区的指针<br>下面举个例子。该例子由两个程序构成,分别为SendData和GetData。<br>SendData程序向GetData程序发送消息,并传递edit1中的字符串;GetData在收到消息后,把SendData发送的字符串接受下来,并显示在相应的edit1中。<br><br>你把下面这段SendData程序例子移稙到你的线程中去就可以了.<br><br>1. SendData程序:<br>……<br>var<br>&nbsp; Form1: TForm1;<br>implementation<br>{$R *.DFM}<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; ds: TCopyDataStruct;<br>&nbsp; hd: THandle;<br>begin<br>&nbsp; ds.cbData := Length (Edit1.Text) + 1;<br>&nbsp; GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存<br>&nbsp; StrCopy (ds.lpData, PChar (Edit1.Text));<br>&nbsp; Hd := FindWindow (nil, 'Form2'); // 获得接受窗口的句柄<br>&nbsp; if Hd &lt;&gt; 0 then<br>&nbsp; &nbsp; &nbsp; &nbsp;SendMessage (Hd, WM_COPYDATA, Handle,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Cardinal(@ds)) // 发送WM_COPYDATA消息<br>&nbsp; else<br>&nbsp; &nbsp; ShowMessage ('目标窗口没找到!');<br>&nbsp; &nbsp;FreeMem (ds.lpData); //释放资源<br>end;<br><br>下面这段GetData例子用来接收线和发送的数据.<br><br>2. GetData程序:<br>&nbsp; TForm2 = class(TForm)<br>&nbsp; &nbsp; Edit1: TEdit;<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; procedure Mymessage(var t:TWmCopyData);message WM_COPYDATA;<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br>var<br>&nbsp; Form2: TForm2;<br>implementation<br>procedure TForm2.Mymessage(var t:TWmCopyData);<br>begin<br>&nbsp; &nbsp;Memo1.Lines.Add(StrPas(t.CopyDataStruct^.lpData));//接受数据并显示。<br>end;<br>使用这种方法是WIN32应用程序进行交互的最简单的方法。<br>
 
你可以用FindWindow寻找程序的handle再发送给它(因为两个程序都是你做的,名字应该知道<br>吧?)。如果是传送大量的数据,我建议你还是用共享内存的方法吧,不麻烦。在A程序中将<br>计划写入共享内存中,在B程序中访问它就可以啊。只要两个程序都是你做的,有很多方法的<br>。如果用消息解决不了就想想其他的办法吧!!
 
如果两个程序都是你开发的,觉得这样可能要好一些<br>1。注册一个消息,得到一个消息的ID<br>2。用自己的消息处理过程代替Application的默认工程<br>3。利用得到ID在程序间传递发送自己的消息,(利用BroadCastSystemMessage函数)<br>4。收到消息,若为自己定义的消息,象处理窗口发送收到的消息,进行处理;否则交给程序自己处理<br>
 
其实这样的问题,论坛上有好多了!你可以先搜索的!!!<br>为了表达简便,我把计划称做 A,批准称为 B,<br><br>首先,定义消息:A 中定义为WM_A,<br>const<br>&nbsp; WM_A=WM_User+100;<br><br>B 中定义为WM_B,<br>const<br>&nbsp; WM_B=WM_User+101;<br><br>然后写消息处理函数:<br>procedure TFormA.WMA(var msg:TMessage);message WM_A;<br>begin<br>case msg.WParam of &nbsp; <br>1:Showmessage('批准');<br>2:Showmessage('修改');<br>3:Showmessage('删除');<br>end;<br>end;<br><br>procedure TFormB.WMB(var msg:TMessage);message WM_B;<br>begin<br>&nbsp; showmessage('Got the Message Sent from Project A');<br>end;<br>然后A可以给B发消息了:<br>可以先根据窗体的标题 用FindWindow()获取B窗体的窗体句柄BHande:=FindWindow(...) ;<br>postmessage(BHande,WM_B,0,0);<br><br>B给A发消息:<br>先用Findwindow()获取A窗体的句柄AHandle;<br>if 批准 then<br>&nbsp; postmessage(AHandle,WM_A,1,0)<br>else if 修改 then<br>&nbsp; postmessage(AHandle,WM_A,2,0)<br>else if 删除 then<br>&nbsp; postmessage(AHandle,WM_A,3,0);<br><br>对于A给B发计划请求的时候,也可以用类似B给A发消息带的 WParam 参数来标志是什么任务,<br>当然也可以用别的方式,如文件或注册表方式,,这就多了,,<br><br><br><br>&nbsp; <br>
 
这种消息简单些,如果用RegisterWindowsMessage()来注册一个系统内唯一的消息常量,<br>那处理要比用WM_USER+偏移量来做要复杂一点,,看你怎么选择了,,
 
to:HeyTommy,这个可以在不同进程之间进行吗?
 
to:木工<br>向系统注册了一个消息,当然是系统一级的消息了。就是有N个程序有响应这个消息的要求<br>,所有的程序都可以用!!
 
用Com的事件回调
 
木工:<br><br>呵呵,,是啊,因为用RegisterWindowsMessage()注册的是系统内唯一的消息常量,<br><br>在多个应用程序中用它注册同一个字符串消息,其返回的消息常量是相同的,,,你可以<br>用SetWindowLong()来把应用程序的WndProc()过程替换成你自己的消息处理函数,但<br>如果你要应用程序处理其它消息的话,要加上Inherited WndProc()哈,,<br><br>对于在不同进程间通信,其实用 WM_USER+偏移量 这种方式做的也可以的,但这个的前提是<br>目标进程中不能有消息常量和你定义的冲突,,,<br><br>呵呵,,还有什么不明白的嘛?可以提出来,,,呵呵,,,
 
后退
顶部