The WM_COPYDATA messages makes it possible to transfer information between processes. It does this by passing the data through the kernel. Space is allocated in the receiving process to hold the information that is copied, by the kernel, from the source process to the target process. The sender passes a pointer to a COPYDATASTRUCT, which is defined as a structure of the following: } type TCopyDataStruct = packed record dwData: DWORD; // anwendungsspezifischer Wert cbData: DWORD; // Byte-L?nge der zu übertragenden Daten lpData: Pointer; // Adresse der Daten end; { Sender Application } unit SenderApp; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Button2: TButton; Image1: TImage; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private procedure SendCopyData(hTargetWnd: HWND; ACopyDataStruct:TCopyDataStruct); public end; var Form1: TForm1; implementation {$R *.DFM} // Sender: Send data // Sender: Daten schicken procedure TForm1.SendCopyData(hTargetWnd: HWND; ACopyDataStruct:TCopyDataStruct); begin if hTargetWnd <> 0 then SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@ACopyDataStruct)) else ShowMessage('No Recipient found!'); end; // Send Text from Edit1 to other app // Text von Edit1 an andere Anwendung schicken procedure TForm1.Button1Click(Sender: TObject); var MyCopyDataStruct: TCopyDataStruct; hTargetWnd: HWND; begin // Set up a COPYDATASTRUCT structure for use with WM_COPYDATA // TCopyDataStruct mit den Sende-Daten Infos ausfüllen with MyCopyDataStruct do begin dwData := 0; // may use a value do identify content of message cbData := StrLen(PChar(Edit1.Text)) + 1; //Need to transfer terminating #0 as well lpData := PChar(Edit1.Text) end; // Find the destination window for the WM_COPYDATA message // Empf?nger Fenster anhand des Titelzeilentextes suchen hTargetWnd := FindWindow(nil,PChar('Message Receiver')); // send the structure to the receiver // Die Struktur an den Empf?nger schicken SendCopyData(hTargetWnd, MyCopyDataStruct); end; // Send Image1 to other app // Image1 an andere Anwendung schicken procedure TForm1.Button2Click(Sender: TObject); var ms: TMemoryStream; MyCopyDataStruct: TCopyDataStruct; hTargetWnd: HWND; begin ms := TMemoryStream.Create; try image1.Picture.Bitmap.SaveToStream(ms); with MyCopyDataStruct do begin dwData := 1; cbData := ms.Size; lpData := ms.Memory; end; // Search window by the window title // Empf?nger Fenster anhand des Titelzeilentextes suchen hTargetWnd := FindWindow(nil,PChar('Message Receiver')); // Send the Data // Daten Senden SendCopyData(hTargetWnd,MyCopyDataStruct); finally ms.Free; end; end; end. {*********************************************************************} { Receiver Application } unit ReceiverApp; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Image1: TImage; Label1: TLabel; private procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMCopyData(var Msg: TWMCopyData); var sText: array[0..99] of Char; ms: TMemoryStream; begin case Msg.CopyDataStruct.dwData of 0: { Receive Text, Text empfangen} begin StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData); label1.Caption := sText; end; 1: { Receive Image, Bild empfangen} begin ms := TMemoryStream.Create; try with Msg.CopyDataStruct^ do ms.Write(lpdata^, cbdata); ms.Position := 0; image1.Picture.Bitmap.LoadFromStream(ms); finally ms.Free; end; end; end; end; end.
用WM_COPYDATA消息好了
就以”用WM_COPYDATA消息好了 ”为例,
谢谢了。
between processes. It does this by passing the data through the kernel.
Space is allocated in the receiving process to hold the information that is copied,
by the kernel, from the source process to the target process.
The sender passes a pointer to a COPYDATASTRUCT, which is defined as a structure
of the following:
}
type
TCopyDataStruct = packed record
dwData: DWORD; // anwendungsspezifischer Wert
cbData: DWORD; // Byte-L?nge der zu übertragenden Daten
lpData: Pointer; // Adresse der Daten
end;
{ Sender Application }
unit SenderApp; interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls; type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure SendCopyData(hTargetWnd: HWND; ACopyDataStruct:TCopyDataStruct);
public
end; var
Form1: TForm1; implementation {$R *.DFM} // Sender: Send data
// Sender: Daten schicken
procedure TForm1.SendCopyData(hTargetWnd: HWND; ACopyDataStruct:TCopyDataStruct);
begin
if hTargetWnd <> 0 then
SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@ACopyDataStruct))
else
ShowMessage('No Recipient found!');
end; // Send Text from Edit1 to other app
// Text von Edit1 an andere Anwendung schicken
procedure TForm1.Button1Click(Sender: TObject);
var
MyCopyDataStruct: TCopyDataStruct;
hTargetWnd: HWND;
begin
// Set up a COPYDATASTRUCT structure for use with WM_COPYDATA
// TCopyDataStruct mit den Sende-Daten Infos ausfüllen
with MyCopyDataStruct do
begin
dwData := 0; // may use a value do identify content of message
cbData := StrLen(PChar(Edit1.Text)) + 1; //Need to transfer terminating #0 as well
lpData := PChar(Edit1.Text)
end;
// Find the destination window for the WM_COPYDATA message
// Empf?nger Fenster anhand des Titelzeilentextes suchen
hTargetWnd := FindWindow(nil,PChar('Message Receiver'));
// send the structure to the receiver
// Die Struktur an den Empf?nger schicken
SendCopyData(hTargetWnd, MyCopyDataStruct);
end; // Send Image1 to other app
// Image1 an andere Anwendung schicken
procedure TForm1.Button2Click(Sender: TObject);
var
ms: TMemoryStream;
MyCopyDataStruct: TCopyDataStruct;
hTargetWnd: HWND;
begin
ms := TMemoryStream.Create;
try
image1.Picture.Bitmap.SaveToStream(ms);
with MyCopyDataStruct do
begin
dwData := 1;
cbData := ms.Size;
lpData := ms.Memory;
end;
// Search window by the window title
// Empf?nger Fenster anhand des Titelzeilentextes suchen
hTargetWnd := FindWindow(nil,PChar('Message Receiver'));
// Send the Data
// Daten Senden
SendCopyData(hTargetWnd,MyCopyDataStruct);
finally
ms.Free;
end;
end; end. {*********************************************************************} { Receiver Application }
unit ReceiverApp; interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls; type
TForm1 = class(TForm)
Image1: TImage;
Label1: TLabel;
private
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end; var
Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
sText: array[0..99] of Char;
ms: TMemoryStream;
begin
case Msg.CopyDataStruct.dwData of
0: { Receive Text, Text empfangen}
begin
StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
label1.Caption := sText;
end;
1: { Receive Image, Bild empfangen}
begin
ms := TMemoryStream.Create;
try
with Msg.CopyDataStruct^ do
ms.Write(lpdata^, cbdata);
ms.Position := 0;
image1.Picture.Bitmap.LoadFromStream(ms);
finally
ms.Free;
end;
end;
end;
end; end.