两个应用程序之间传递消息(200分)

  • 主题发起人 主题发起人 ysl66
  • 开始时间 开始时间
Y

ysl66

Unregistered / Unconfirmed
GUEST, unregistred user!
试了两种方法都不成功:<br>1两个程序都定义了相同的消息const Mymessage = USER + $1000;<br>一个执行消息发送(postMessage() or sendMessage()),<br>另一个执行接收消息(procedure get_message(var Message:TMessage)<br>;Message MyMessage;)<br>2使用两个程序在创建时调用RegisterWindowMessage()函数注册同一个消息<br>一个执行消息发送(postMessage() or sendMessage()),<br>另一个执行接收消息<br>procedure TForm1.DefaultHandler(var Msg);<br>begin<br>&nbsp; inherited DefaultHandler(Msg);<br>&nbsp; {if the user defined message was recieved...}<br>&nbsp; if (TMessage(Msg).Msg=UserMessage) then<br>&nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; showmessage('1111111111111');<br>&nbsp; end;<br>end;<br>是按照Window API帮助做的也不成功。<br>
 
感谢cnaoszh的提示,但两个程序一个是用Delphi编写的,另一个是用PB编写的<br>所以只能使用都可以调用的Window API来实现.
 
用 WM_COPYDATA 吧.
 
Like this , 我长期这么用,包你百发百中。<br><br>const<br>&nbsp; MY_MESSAGE = WM_USER + $xxxx;<br>type<br>&nbsp; TfrmMain = class(TForm)<br>&nbsp; &nbsp; .......<br>&nbsp; private<br>&nbsp; &nbsp; procedure MyHandle(var Msg: TMessage); message MY_MESSAGE;<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; end;<br><br>implimentation<br><br>procedure TfrmMain.MyHandle(var Msg: TMessage);<br>begin<br>&nbsp; .......<br>end;<br>
 
谢谢坏蟑螂,你的方法在一个程序中确实百发百中,但在两个程序之间就不那末灵了。
 
谢谢坏蟑螂,你的方法在一个程序中确实百发百中,但在两个程序之间就不那末灵了。
 
不可能!我就是在多个程序/进程之间用的!<br><br>老兄,不要忘了先FindWindow()对方的窗口HANDLE!<br>既然你截获消息的函数是定义在TfrmMain中的,发消息就应发往此窗口。<br>
 
你是要实现进程间通讯吗?<br>最好的办法是用Socket实现。
 
坏蟑螂<br>不好意思,我想看看你发消息的程序源码。谢谢!
 
进程间通信用SOCKET确实不错,而且即使你以后打算将两个/多个进程分布到不同的计算机,<br>也不会有太大改动。但如果以后没有这种可能,还是用消息吧,毕竟代码量小点,是吗,YASON?<br><br>TO YS166:<br>可以这样写:<br>假设程序A的某个窗口的标题是“WINDOW A”,<br>程序B要向此窗口发消息,要先找到A 窗口。<br>&nbsp; MyHandle := FindWindow(0,'WINDOW A');<br>如果程序A是用DELPHI写的,那么你知道其类名TfrmMain,还可以写作:<br>&nbsp; MyHandle := FindWindow('TfrmMain', 'WINDOW A');<br><br>然后,发消息:<br>&nbsp; if (MyHandle&gt;0) &nbsp;//找到了!<br>&nbsp; &nbsp; SendMessage(MyHandle, MY_MESSAGE, xxx,xxx);<br><br><br>再在程序A中收消息,就是前述代码了。<br><br><br>Good Luck !
 
问题解决,感谢各位!
 
后退
顶部