Delphi使用WM_CopyData来进行多进程之间的数据传递

下面代码只为实现不考虑线程安全因素 仅供参考

unit Unit_Main;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
  TForm_Main = class(TForm)
    Memo: TMemo;
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Procedure ShareMSG(Var Msg:TMessage); Message WM_COPYDATA;
  end;
Var
  Form_Main: TForm_Main;
  uMax     :Integer;
implementation
{$R *.dfm}
Procedure TForm_Main.ShareMSG(Var Msg:TMessage);
begin
  if Msg.Msg = WM_COPYDATA then
  begin
    Caption    := '第:' + IntToStr(PCopyDataStruct(Msg.LParam)^.cbData) + '次收到数据!~';
    Msg.Result := 1; //返回1
  end;
end;

Function ThreadProc(lpParam:Pointer):DWORD; Stdcall;
Var
  hWin  :HWND;
  Data  :TCopyDataStruct;
  uCount:Integer;
begin
  Result := 0;
  hWin   := HWND(lpParam);
  for uCount := 1 to uMax do
  begin
    ZeroMemory(@Data, SizeOf(Data));
    Data.dwData := 0;
    Data.cbData := uCount;  //数据的大小
    Data.lpData := Nil;     //数据内存指针
    if SendMessage(hWin, WM_COPYDATA, 0, lParam(@Data)) = 1 then
    begin
      Form_Main.Memo.Lines.Add('第:' + IntToStr(uCount) + '次发送!~');
    end;
    Sleep(30);
  end;    
end;  

procedure TForm_Main.Button1Click(Sender: TObject);
Var
  hWin :HWND;
  lThread   :THandle;
  lThreadId :DWORD;  
begin
  hWin := FindWindowW('TForm_Main', 'Process_B'); 
  if hWin > 32 then
  begin
    uMax    := StrToInt(Edit1.Text);
    lThread := CreateThread(nil, 0, @ThreadProc, Pointer(hWin), 0, lThreadId);
    CloseHandle(lThread);
  end Else
  begin
    Memo.Lines.Text := '没有找到进程B的窗口';
  end;    
end;
end.


标签: delphi, 消息, wm_copydata, 多进程, 交互, 数据传递

添加新评论