WM_COPYDATA使用例子

server:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, RzPanel, jpeg, RzShellDialogs;

const
  WM_CopyDateDestory = wm_user + 100;  //self define message

type
  TPerson = packed record
    Name :string[10];
    Age  :Integer;
end;

type
  Tserver = class(TForm)
    RzPanel1: TRzPanel;
    RzPanel2: TRzPanel;
    RzPanel3: TRzPanel;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Edit3: TEdit;
    Image_D: TImage;
    RzPanel4: TRzPanel;
    RzPanel5: TRzPanel;
    Image_s: TImage;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }

  public
    { Public declarations }
    procedure _WM_COPYDATA(var _Msg :TMessage);message WM_COPYDATA;
  end;

var
  server: Tserver;
  _PictureMemoryStream :TMemoryStream;

implementation

{$R *.dfm}

procedure Tserver._WM_COPYDATA(var _Msg :TMessage);
var
  _CopyData :TCopyDataStruct;
  _Person   :TPerson;
  _MemStream :TMemoryStream;
  _MemSize   :Cardinal;
  _Buf :array of Char;
begin
  if _Msg.Msg = WM_COPYDATA then
  begin
    if _Msg.WParam = $02 then
    begin
      _CopyData := PCopyDataStruct(_Msg.LParam)^;
      _Person   := TPerson(_CopyData.lpData^);
      Edit3.Text := _Person.Name + IntToStr(_Person.Age);
    end
    else if _Msg.WParam = $03 then
    begin
      _MemStream := TMemoryStream.Create;
      _CopyData  := PCopyDataStruct(_Msg.LParam)^;
      _MemSize   := _CopyData.cbData;

      //mothod 1 ---------------------------------------------------------------
      SetLength(_Buf, _MemSize);
      Move(_CopyData.lpData^, _Buf[0], _MemSize);
      _MemStream.WriteBuffer(_Buf[0], _MemSize);
      //------------------------------------------------------------------------

      //mothod 1 ---------------------------------------------------------------
      //_MemStream.WriteBuffer(_CopyData.lpData^, _MemSize);
      //------------------------------------------------------------------------
      _MemStream.SaveToFile('d:/1.jpg');
      _MemStream.Free;
      Image_D.Picture.LoadFromFile('d:/1.jpg');  
    end
    else if _Msg.Msg = WM_CopyDateDestory then
    begin
      if _PictureMemoryStream <> nil then
      begin
        _PictureMemoryStream.Free;
        _PictureMemoryStream := nil;
      end;
    end;
  end;
end;


procedure Tserver.Button1Click(Sender: TObject);
var
  _CopyData :TCopyDataStruct;
  _Person   :TPerson;
begin
  _Person.Name := Edit1.Text;
  _Person.Age  := StrToInt(Edit2.Text);

  _CopyData.dwData := 0;
  _CopyData.cbData := SizeOf(_Person);
  _CopyData.lpData := @_Person;

  SendMessage(Handle, WM_COPYDATA, $02, LongWord(@_CopyData));
end;

procedure Tserver.Button2Click(Sender: TObject);
var
  _PictureCopyDat :TCopyDataStruct;
  _FileSize :Int64;
  _hwnd :HWND;
begin
  if _PictureMemoryStream = nil then
    _PictureMemoryStream := TMemoryStream.Create;
   
  Image_s.Picture.Graphic.SaveToStream(_PictureMemoryStream);
  _PictureCopyDat.dwData := 0;
  _FileSize              := _PictureMemoryStream.Size;
  _PictureCopyDat.cbData := _FileSize;
  _PictureCopyDat.lpData := _PictureMemoryStream.Memory;
  _hwnd := FindWindow(nil,'client');
  if _hwnd <> 0 then
    SendMessage(_hwnd, WM_COPYDATA, $03, Cardinal(@_PictureCopyDat));//send other program

  SendMessage(Handle, WM_COPYDATA, $03, Cardinal(@_PictureCopyDat)); //send this program
end;

procedure Tserver.FormCreate(Sender: TObject);
begin
  _PictureMemoryStream := TMemoryStream.Create;
end;

procedure Tserver.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if _PictureMemoryStream  <> nil then
  begin
    _PictureMemoryStream.Free;
    _PictureMemoryStream := nil;
  end;
end;

end.

 

 

 

client:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg;

const
  WM_CopyDateDestory = wm_user + 100;

type
  TWidthAndHeight = packed record
    Width  :Integer;
    Height :Integer;
end;

type
  TForm1 = class(TForm)
    Image_D: TImage;
  private
    { Private declarations }

      public
    { Public declarations }
    procedure _WM_COPYDATA(var _Msg :TMessage);message WM_COPYDATA;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1._WM_COPYDATA(var _Msg :TMessage);
var
  _MemStream :TMemoryStream;
  _MemSize   :Cardinal;
  _CopyData :TCopyDataStruct;
  _hwnd_Server :HWND;
  _FileName :string;
begin
  if _Msg.Msg = WM_COPYDATA then
  begin
    _FileName  := 'd:/client.jpg';
    _MemStream := TMemoryStream.Create;
    _CopyData  := PCopyDataStruct(_Msg.LParam)^;
    _MemSize   := _CopyData.cbData;
    _MemStream.WriteBuffer(_CopyData.lpData^, _MemSize);
    _MemStream.SaveToFile(_FileName);
    _MemStream.Free;
 
    if FileExists(_FileName) then
      Image_D.Picture.LoadFromFile(_FileName);

    _hwnd_Server := FindWindow(nil, 'server');
    if _hwnd_Server <> 0 then
      SendMessage(_hwnd_Server, WM_CopyDateDestory, 0, 0);
  end;
end;

end.

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值