Delphi hat eingebaute Funktion FindControl()
, die TWinControl
der angegebenen hWnd zurückgibt. Aber es funktioniert für die gleiche Instanz von VCL. Ich denke, du solltest es untersuchen. Nachdem Sie den Zeiger auf das TWinControl-Objekt gesetzt haben, befindet sich sein Name (String) unter +8
offset. Sie können ReadProcessMemory versuchen, es zu lesen. Das Hauptproblem besteht darin, eine Version von FindControl() zu erstellen, die Ihren Anforderungen entspricht.
Edit: (habe es endlich: D) Aufruf GetWinControlName Funktion
// Get Pointer to TWinControl in another process
function GetWinControl(Wnd: HWND; out ProcessId: THandle): Pointer;
var
WindowAtomString: String;
WindowAtom: ATOM;
begin
if GetWindowThreadProcessId(Wnd, ProcessId) = 0 then RaiseLastOSError;
// This is atom for remote process (See controls.pas for details on this)
WindowAtomString := Format('Delphi%.8X',[ProcessID]);
WindowAtom := GlobalFindAtom(PChar(WindowAtomString));
if WindowAtom = 0 then RaiseLastOSError;
Result := Pointer(GetProp(Wnd, MakeIntAtom(WindowAtom)));
end;
function GetWinControlName(Wnd: HWND): string;
var
ProcessId: THandle;
ObjSelf: Pointer;
Buf: Pointer;
bytes: Cardinal;
destProcess: THandle;
begin
ObjSelf := GetWinControl(Wnd, ProcessId);
destProcess := OpenProcess(PROCESS_VM_READ, TRUE, ProcessId);
if destProcess = 0 then RaiseLastOSError;
try
GetMem(Buf, 256);
try
if not ReadProcessMemory(destProcess, Pointer(Cardinal(ObjSelf) + 8), Buf, 4, bytes) then RaiseLastOSError;
if not ReadProcessMemory(destProcess, Pointer(Cardinal(Buf^)), Buf, 256, bytes) then RaiseLastOSError;
Result := PChar(Buf);
finally
FreeMem(Buf);
end;
finally
CloseHandle(destProcess);
end;
end;
Wenn Sie den Code steuern Sie auf einen benutzerdefinierten Fenster Nachricht – Remko
Oder einfach definieren Sie Ihren eigenen Satz von WM_USER Nachrichten durch Rücksendung der Name reagieren kann –
Haben Sie die Kontrolle über die beiden Anwendungen? Kannst du beides neu bauen? – kobik