postMessage()的问题?(100)

  • 主题发起人 主题发起人 dai_wei
  • 开始时间 开始时间
D

dai_wei

Unregistered / Unconfirmed
GUEST, unregistred user!
PostMessage(.......)后面两个参数能不能是字符型的,我想把"你好"这两个字符,通过PostMessage()的形式发送到另个窗口上,怎么搞?请知道的同行们给个例子.
 
问题描述的不够清楚
 
我再把意思写一下.我想用PostMessage(........)把 "你好" 这两个字发到另外一个窗口去,怎么写这个发送消息的? 发送过去后,窗口是怎么接收到的.
 
如果是同一个进程(程序)内,你就将这个字符串的指针传过去。如果是两个程序之间进行数据交流,得用到特殊的消息。你在网上查查这个消息的用法吧,我这台机子上没实例给你。WM_COPYDATA
 
在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能。例如两个应用程序间的同步、互斥;应用程序在起第二份实例时的参数自动传递…。要实现这些功能,就必须能实现程序间的数据传递。有些特殊的高级技术可在不同的程序间传递数据,如剪贴板、动态数据交换以及 OLE自动化,但有条件限制并且相对较复杂。这里,我介绍三种有效的底层技术,希望对编程爱好者有所帮助。利用 WM_COPYDATA消息 使用该消息涉及一个 TcopyDataStruct结构类型的指针。该结构中有三个成员:dwData 是一个 32位的附加参数cbData 表示要传递的数据区的大小lpData 表示要传递的数据区的指针下面举个例子。该例子由两个程序构成,分别为 SendData和 GetData。SendData程序向 GetData程序发送消息,并传递 edit1中的字符串; GetData在收到消息后,把 SendData发送的字符串接受下来,并显示在相应的 edit1中。SendData程序:……varForm1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);vards: TCopyDataStruct;hd: THandle;beginds.cbData := Length (Edit1.Text) + 1;GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存StrCopy (ds.lpData, PChar (Edit1.Text));Hd := FindWindow (nil, 'Form2'); // 获得接受窗口的句柄if Hd <> 0 thenSendMessage (Hd, WM_COPYDATA, Handle,Cardinal(@ds)) // 发送 WM_COPYDATA消息elseShowMessage ('目标窗口没找到! ');FreeMem (ds.lpData); //释放资源end;GetData程序: TForm2 = class(TForm)Edit1: TEdit;private{ Private declarations }publicprocedure Mymessage(var t:TWmCopyData);message WM_COPYDATA;{ Public declarations }end;varForm2: TForm2;implementationprocedure TForm2.Mymessage(var t:TWmCopyData);beginEdit1.text:=StrPas(t.CopyDataStruct^.lpData);//接受数据并显示。end;使用这种方法是 WIN32应用程序进行交互的最简单的方法
 
还有一个简单的方法,你参考如下的帖子:http://www.delphibbs.com/delphibbs/dispq.asp?lid=3938794在给你一个发中文的方法:procedure TForm1.btn1Click(Sender: TObject);var S: string;begin S := '中'; SendMessage(edt1.Handle, WM_IME_CHAR,(Ord(S[1]) shl 8) + Ord(S[2]) , 0);end;
 
a:='你好!';SendMessage(Hwnd,WM_SETTEXT,Integer(@a),0);
 
Crazy119 和 wqhatnet说的对,同一进程 转成PChar处理不同进程使用WM_COPYDATA
 
多人接受答案了。
 
后退
顶部