Mam funkcję pobierającą nazwę [NAME] kontrolki innej aplikacji:
// Get Pointer to TWinControl in another process
function GetWinControl(Wnd: HWND; out ProcessId: THandle): Pointer;
var
WindowAtomString: String;
WindowAtom: ATOM;
begin
GetWindowThreadProcessId(Wnd, @ProcessId);
// This is atom for remote process (See controls.pas for details on this)
WindowAtomString := Format('Delphi%.8X',[ProcessID]);
WindowAtom := GlobalFindAtom(PChar(WindowAtomString));
Result := Pointer(GetProp(Wnd, MakeIntAtom(WindowAtom)));
end;
function GetWinControlName(Wnd: HWND): WideString;
var
ProcessID: THandle;
ObjSelf: Pointer;
Buf: Pointer;
bytes: NativeUInt;
destProcess: THandle;
begin
ObjSelf := GetWinControl(Wnd, ProcessId);
destProcess := OpenProcess(PROCESS_VM_READ, TRUE, ProcessId);
GetMem(Buf, 256);
try
if ReadProcessMemory(destProcess, Pointer(Cardinal(ObjSelf) + 8), Buf, 4, bytes) then
begin
ReadProcessMemory(destProcess, Pointer(Cardinal(Buf^)), Buf, 256, bytes);
Result := PChar(Buf);
end;
finally
FreeMem(Buf);
CloseHandle(destProcess);
end;
end;
Wszystko pięknie, ładnie, ale działa tylko na aplikacjach, które zostały przekompilowane (tak mi się wydaje) w wersji środowiska XE+.
Mam wiele programów napisanych w Delphi XE3 i ten kod działa właśnie dla tych programów. Natomiast dla programów pisanych w wersjach delphi niższych np. Delphi 7, 2007 wyświetla chińskie znaki i znaki ASCII.
Jaka może być tego przyczyna?