朝花朝拾

朝花昔时杯中酒

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

1、直接传递,但只能传递给同进程的窗口,无法实现跨进程的消息传递

传递消息:

[delphi] view plaincopy
 
  1. var  
  2.   Str: String;  
  3. begin  
  4.   Str := 'some string';  
  5.   PostMessage(Handle, 0, 0, Integer(Str));  
  6. end;  

接收消息:

[delphi] view plaincopy
 
  1. var  
  2.   Str: String;  
  3. begin  
  4.   Str := String(Msg.LParam);  
  5.   ShowMessage(Str);  
  6. end;  


2、如果线程之间传递可以使用PostThreadMessage传递,PostThreadMessage是该函数将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。
传递消息:

[delphi] view plaincopy
 
  1. Procedure   TThread1.Execute;  
  2.   var  
  3.       sMes:String;  
  4.       pMes:^String;  
  5.       iTemp:Integer;  
  6.   begin  
  7.       sMes:=’Test’;  
  8.       New(pMes);  
  9.       pMes^:=sMes;  
  10.       PostThreadMessage(thread2.ThreadID,WM_StartRecording,Integer(pMes),0);  
  11.       iTemp:=111;  
  12.       PostThreadMessage(thread2.ThreadID,WM_OriginalData,iTemp,0);  
  13.   end;    

接收消息:

[delphi] view plaincopy
 
  1. procedure   TThread2.Execute;    
  2.   var    
  3.       msg:TMsg;    
  4.       sMes:String;    
  5.       pMes:^String;    
  6.       iTemp:Integer;    
  7.   begin    
  8.       //消息循环    
  9.       while   GetMessage(msg,0,0,0)   do    
  10.       begin    
  11.           Case   msg.message   of    
  12.               WM_StartRecording:    
  13.               begin    
  14.                   //传过来的是String;    
  15.                   pMes:=msg.wParam;    
  16.                   sMes:=pMes^;    
  17.                   Dispose(pMes);    
  18.               WM_OriginalData:    
  19.               begin    
  20.                   //传过来的是整数    
  21.                   iTemp:=msg.WParam;    
  22.               end;    
  23.               else   begin    
  24.                   TranslateMessage(msg);    
  25.                   DispatchMessage(msg);    
  26.               end;    
  27.           end;    
  28.       end;    
  29.   end;   

使用该方法同时还可以传递stringlist,方法是:

[delphi] view plaincopy
 
  1. 发送方:  
  2. a:TStrings;  
  3. a := TStringList.Create;  
  4. SendMessage(Formb.Handle,   WM_YOURMESSAGE,   0,   LongInt(a));     
  5. 接收方:  
  6. b:TStrings;  
  7. b := TStringList.Create;  
  8. b.Assign(TStrings(Msg.WParam));  
  9. TStrings(Msg.WParam).Free;  
如果同一进程传递字符串可以使用PostMessage传递,该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得。
发送消息:
[delphi] view plaincopy
 
  1. <pre class="delphi" name="code">var  
  2.     pTel: ^string;  
  3. begin  
  4.      sTelTmp := '10086';  
  5.      New(pTel);  
  6.      pTel^ :=sTelTmp;  
  7.      SendMessage(Handle, WM_RCV_AUTO_REPORT, EV_TEL_MT_CALLOUT, Integer(pTel));  
  8. end;</pre><br>  
  9. <pre></pre>  
  10. <br>  
  11. 接收消息:  
[delphi] view plaincopy
 
    1. <pre class="delphi" name="code">procedure OnReciveDataMsg(var Msg: TMessage); message WM_RCV_AUTO_REPORT;  
    2. var  
    3.     pTel: ^string;  
    4. begin  
    5.     pTel := Pointer(Msg.LParam);  
    6.     sTelPhone := G_GetRealTelPhone(pTel^);  
    7.     Dispose(pTel);  
    8. end;  
    9. </pre>  
    10. <pre></pre>  
    11. <p> </p>  
    12. <p><strong>3、使用WM_COPYDATA传递,进程间的数据传递好像只有用wm_copydata消息,它可以跨进程拷贝内存。</strong></p>  
    13. <p>发送消息:</p>  
    14. <pre class="delphi" name="code">procedure SendString(strMSG: string);  
    15. var  
    16.   Data: tagCOPYDATASTRUCT;  
    17.   pBuf: PChar;  
    18. begin  
    19.   GetMem(pBuf, Length(strMSG) + 1);  
    20.   
    21.   try  
    22.     ZeroMemory(pBuf, Length(strMSG) + 1);  
    23.     StrPCopy(pBuf, strMSG);  
    24.   
    25.     Data.cbData:= Length(strMSG);  
    26.     Data.dwData:= Length(strMSG);  
    27.     Data.lpData:= pBuf;  
    28.   
    29.     SendMessage(hTargetWin, WM_COPYDATA, Integer(Self.Handle), Integer(@Data));  
    30.   finally  
    31.     FreeMem(pBuf);  
    32.   end;  
    33. end;</pre>  
    34. <p><br>  
    35. 接收消息:</p>  
    36. <pre class="delphi" name="code">procedure WMCopyData(var MSG: TMessage); message WM_COPYDATA;  
    37. procedure WMCopyData(var MSG: TMessage);  
    38. var  
    39.   Data  : ^tagCOPYDATASTRUCT;  
    40.   strMSG: string;  
    41. begin  
    42.   Data:= Pointer(Msg.lParam);  
    43.   
    44.   strMSG:= StrPas(Data.lpData);  
    45.   
    46.   ShowMessage(strMSG);  
    47. end;</pre>  
    48. <p><br>  
    49. 可以根据实际情况使用相应的方式来实现消息传递字符串。<br>  
    50. </p>  
posted on 2015-04-14 17:50  朝花朝拾  阅读(383)  评论(0编辑  收藏  举报