Aslo entweder du baust dann die Verzögerung ein nach startobservation (ein einfaches Sleep(100) dürfte aber ausreichen) oder ich sende aus dem Remotethread eine Message, dass alles vorbereitet ist:
Delphi-Quellcode:
//Deklaration in TForm1
procedure GetReadyMsg(var msg:TMessage);message mymsg+3;
.
.
.
function injectThread(memory:Pmemory):integer;stdcall;
//Die eigentliche Thread-Funktion
//Hauptaufgabe: einklinken und am Ende wieder ausklinken unserer neuen WndProc
//dazwischen nur sleep, bis die Message mymsg+1 and die neue WndProc kommt
begin
memory^.running:=true;
memory^.oldwindowProc:=memory^.getwindowlong(memory^.watchwnd,gwl_wndproc);
memory^.getInfoFunc:=@memory^.getInfo;
memory^.setwindowlong(memory^.watchwnd,gwl_wndproc,memory);
memory^.Postmessage(memory^.backwnd,memory^.backmsg+3,0,0); //Message, dass alles eingerichtet/vorbereitet ist
while memory^.running do memory^.sleep(200);
memory^.setwindowlong(memory^.watchwnd,gwl_wndproc,memory^.oldwindowproc);
result:=0;
memory^.exitthread(0);
end;
Delphi-Quellcode:
procedure Tform1.GetReadyMsg(var msg:TMessage);
begin
//wird automatisch vom Remotethread "gestartet", wenn er soweit ist
communicate('TImage',sImageSizefromclassname,2);
communicate('Image2',sImageSize);
communicate('Label1',sCaption);
stopobservation; //hier oder später
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.clear;
myhandle:=findwindow(nil,'PImage');
if myhandle=0 then exit;
startobservation;
end;
Aber, wenn du gleich stopobservation aufrufst, dann bekommst du ja nicht mehr mit, wenn das Window eine WM_Paint Message zum neuzeichnen bekommt.
Du kannst übrigens auch das Erstellen und das Entfernen des Formulars ereignisgesteuert überwachen.
Aber solange wir das mit dem Communicate, also die Info-funktion nicht hinbekommen, brauchen wir den Rest nicht mehr zu probieren. Da bräuchten wir wirklich die entspr. Delphiversion.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.