delphi의 메시지 메커니즘 메시지 전달 문자열 구현

4304 단어
delphi에서 메시지 전달 문자열을 사용하는 세 가지 방법은 다음과 같습니다.
1. 직접 전달하지만 같은 프로세스의 창에만 전달할 수 있고 크로스 프로세스의 메시지 전달을 실현할 수 없다
메시지 전송:
var
  Str: String;
begin
  Str := 'some string';
  PostMessage(Handle, 0, 0, Integer(Str));
end;

메시지를 수신하려면 다음과 같이 하십시오.
var
  Str: String;
begin
  Str := String(Msg.LParam);
  ShowMessage(Str);
end;

2. 만약에 스레드 간 전달이 PostThreadMessage로 전달될 수 있다면 PostThreadMessage는 이 함수로 지정된 스레드의 메시지 대기열에 메시지를 넣고 스레드 처리 메시지를 기다리지 않고 되돌아온다.메시지 전송:
Procedure   TThread1.Execute;
  var
      sMes:String;
      pMes:^String;
      iTemp:Integer;
  begin
      sMes:=’Test’;
      New(pMes);
      pMes^:=sMes;
      PostThreadMessage(thread2.ThreadID,WM_StartRecording,Integer(pMes),0);
      iTemp:=111;
      PostThreadMessage(thread2.ThreadID,WM_OriginalData,iTemp,0);
  end;  

메시지를 수신하려면 다음과 같이 하십시오.
procedure   TThread2.Execute;  
  var  
      msg:TMsg;  
      sMes:String;  
      pMes:^String;  
      iTemp:Integer;  
  begin  
      //      
      while   GetMessage(msg,0,0,0)   do  
      begin  
          Case   msg.message   of  
              WM_StartRecording:  
              begin  
                  //     String;  
                  pMes:=msg.wParam;  
                  sMes:=pMes^;  
                  Dispose(pMes);  
              WM_OriginalData:  
              begin  
                  //         
                  iTemp:=msg.WParam;  
              end;  
              else   begin  
                  TranslateMessage(msg);  
                  DispatchMessage(msg);  
              end;  
          end;  
      end;  
  end; 

이 방법을 사용하면 다음과 같이 stringlist를 전달할 수 있습니다.
   :
a:TStrings;
a := TStringList.Create;
SendMessage(Formb.Handle,   WM_YOURMESSAGE,   0,   LongInt(a));   
   :
b:TStrings;
b := TStringList.Create;
b.Assign(TStrings(Msg.WParam));
TStrings(Msg.WParam).Free;

같은 프로세스 전달 문자열이 PostMessage 전달을 사용할 수 있다면, 이 함수는 지정한 창에 생성된 루트와 연결된 메시지 대기열에 메시지를 넣고, 루트 처리 메시지를 기다리지 않고 되돌아오는 비동기 메시지 모드입니다.메시지 대기열의 메시지는 GetMessage와 PeekMessage를 호출해서 얻을 수 있습니다.
메시지를 보내려면 다음과 같이 하십시오.
var
    pTel: ^string;
begin
     sTelTmp := '10086';
     New(pTel);
     pTel^ :=sTelTmp;
     SendMessage(Handle, WM_RCV_AUTO_REPORT, EV_TEL_MT_CALLOUT, Integer(pTel));
end;

procedure OnReciveDataMsg(var Msg: TMessage); message WM_RCV_AUTO_REPORT;
var
    pTel: ^string;
begin
    pTel := Pointer(Msg.LParam);
    sTelPhone := G_GetRealTelPhone(pTel^);
    Dispose(pTel);
end;

 

3、 WM_COPYDATA , wm_copydata , 。

procedure SendString(strMSG: string);
var
  Data: tagCOPYDATASTRUCT;
  pBuf: PChar;
begin
  GetMem(pBuf, Length(strMSG) + 1);

  try
    ZeroMemory(pBuf, Length(strMSG) + 1);
    StrPCopy(pBuf, strMSG);

    Data.cbData:= Length(strMSG);
    Data.dwData:= Length(strMSG);
    Data.lpData:= pBuf;

    SendMessage(hTargetWin, WM_COPYDATA, Integer(Self.Handle), Integer(@Data));
  finally
    FreeMem(pBuf);
  end;
end;
메시지를 수신하려면 다음과 같이 하십시오.
procedure WMCopyData(var MSG: TMessage); message WM_COPYDATA;
procedure WMCopyData(var MSG: TMessage);
var
  Data  : ^tagCOPYDATASTRUCT;
  strMSG: string;
begin
  Data:= Pointer(Msg.lParam);

  strMSG:= StrPas(Data.lpData);

  ShowMessage(strMSG);
end;
실제 상황에 따라 상응하는 방식으로 메시지 전달 문자열을 실현할 수 있다.

좋은 웹페이지 즐겨찾기