Problem 1:
FindWindow gibt Dir halt das erste beste Fenster mit dem Text "Test" zurück. Bei Windows ist aber fast alles ein Fenster. Nicht nur das was wir als Fenster kennen. Auch ein Button ist gern mal ein Fenster (jedenfalls für "FindWindow"). Eine erste Lösung (Im Sinne von Quick&Dirty) kann sein, dass Du einen hinreichend eindeutigen Namen für die Fensterklasse vergibst. Also statt "TForm" nennst Du das Dingen "TMeineEmfaengerForm". Dann änderst Du den Aufruf in
hTargetWnd:=FindWindow('TMeineEmfaengerForm', nil);
.
Problem 2:
Wenn Du zwischen Delphi 3 und Delphi 10 Strings austauschen willst, musst Du bedenken, dass bei Delphi 3 ein String ein AnsiString ist. Bei Delphi 10 ist es aber eine UTF16-String. Für den Test kannst Du bei dem Delphi 10-Programm auf AnsiStrings wechseln.
Beim Sender unter Delphi 10
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
aCopyData: TCopyDataStruct;
hTargetWnd: HWND;
s:Ansistring;
begin
s:='
test';
with aCopyData
do
begin
dwData := 0;
cbData := Length(s) + 1;
lpData := PAnsiChar(s);
end;
hTargetWnd:=FindWindow('
TMeineEmfaengerForm',
nil);
if hTargetWnd <> 0
then
SendMessage(hTargetWnd, WM_COPYDATA, Longint(
Handle), Longint(@aCopyData))
else
ShowMessage('
No Recipient found!');
end;
Beim Empfänger unter Delphi 10
Delphi-Quellcode:
procedure TMeineEmfaengerForm.WMCopyData(var Msg: TWmCopyData);
var
s: Ansistring;
begin
SetString(s, PAnsiChar(Msg.CopyDataStruct.lpData), Msg.CopyDataStruct.cbData);
label1.Caption := String(s);
end;