Hallo allerseits.
Ich steh hier vor dem Problem eine fremde Listview (Das Fremd Programm ist in VB6 programmiert(Listview
Ansi)) auszulesen.
Mit Winspy (2.03.523) klappt das perfekt.
Das
Handle der Listview wird auch richtig erkannt .
Nur die Items werden nicht ausgelesen.
Ich benutze folgenden Code um die Items auszulesen.
Code:
function ListViewColumnCount(mHandle: hwnd): Integer;
begin
Result := Header_GetItemCount(ListView_GetHeader(mHandle));
// Funktioniert!
end;
Code:
function GetListViewText(mHandle: hwnd; mStrings: TStrings): Boolean;
var
vColumnCount: Integer;
vItemCount: Integer;
I, J: Integer;
vBuffer: array[0..255] of Char;
vPRocessId: DWord;
vProcess: THandle;
vPointer: Pointer;
vNumberOfBytesRead: SIZE_T;
S: string;
vItem: TLVItem;
begin
Result := False;
if not Assigned(mStrings) then
Exit;
vColumnCount := ListViewColumnCount(mHandle);
if vColumnCount <= 0 then
Exit;
vItemCount := ListView_GetItemCount(mHandle);
GetWindowThreadProcessId(mHandle, @vPRocessId);
vProcess := OpenProcess(PROCESS_VM_OperaTION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, vPRocessId);
vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
mStrings.BeginUpdate;
try
mStrings.Clear;
for I := 0 to vItemCount - 1 do
begin
S := '';
for J := 0 to vColumnCount - 1 do
begin
with vItem do
begin
mask := LVIF_TEXT;
iItem := I;
iSubItem := J;
cchTextMax := SizeOf(vBuffer);
pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));
end;
WriteProcessMemory(vProcess, vPointer, @vItem, SizeOf(TLVItem), vNumberOfBytesRead);
SendMessage(mHandle, LVM_GETITEM, I, lparam(vPointer));
ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)), @vBuffer[0], SizeOf(vBuffer),
vNumberOfBytesRead);
S := S + #9 + vBuffer;
end;
Delete(S, 1, 1);
mStrings.Add(S);
end;
finally
VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
CloseHandle(vProcess);
mStrings.EndUpdate;
end;
Result := True;
end; { GetListViewText }
Das seltsame ist wenn ich das mit einer Delphi fremd Application teste wird die Listview sauber ausgelesen.
nur bei diesem Programm bekomme ich leere Items.
Allerdings mit Winspy wird die VB Listview sauber ausgelesen.
Chris