Einzelnen Beitrag anzeigen

cyberia

Registriert seit: 31. Aug 2011
1 Beiträge
 
#1

Auslesen einer fremden ListView (Texte sind manchmal leer, je nach ListView-Klasse)

  Alt 1. Sep 2011, 09:57
Hallo,

ich habe ein Problem mit dem Auslesen einer ListView die zu einer fremden Applikation gehört. Diese ListView hat die Klasse ListView20WndClass. Ich habe bereits verschiedene Coding-Snippets aus dem Netz ausprobiert und komme leider immer zum selben Ergebnis:

- SysListView32 lässt sich perfekt auslesen
- TListView lässt sich perfekt auslesen
- Im Falle einer ListView20WndClass scheitert der Aufruf ListView_GetItem (Ergebnis wird false)

Der Handle ist in jedem Fall korrekt. Bisher habe ich GrabListView sowie ein Snippet von Madshi ausprobiert. Das Coding von Madshi gefällt mir eigentlich besser (siehe unten). Der Effekt ist aber überall derselbe: ListView_GetItem liefert false zurück.

Ich hatte schon vermutet dass sich die Instanz der ListView20WndClass die ich auslesen möchte aus irgendeinem Grunde gar nicht auslesen lässt aber mit Hilfe von WinSpy2008 hier aus dem Forum lässt sich der Content ohne Probleme auslesen.

Delphi-Quellcode:
var ListView : hWnd;
    TmpPC : PChar;
    PListItem : ^LV_ITEM;
    ListItem : LV_ITEM;
    CurrentPos,
    ItemCount : Integer;
    pid : dword; // process ID
    ph : dword; // process handle
    c1 : dword; // dummy variable
    arrCh : array [0..255] of char;
begin
  listbox1.Clear;

  ListView:=Self.windowHandle;

  // ask the process ID of the other process
  GetWindowThreadProcessID(ListView, @pid);
  logInfo('pid',pid);

  // open the other process
  ph := OpenProcess(PROCESS_ALL_ACCESS, false, pid);

  // allocate memory in the other process
  TmpPC := VirtualAllocEx(ph, nil, 255, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  PListItem := VirtualAllocEx(ph, nil, sizeOf(LV_ITEM), MEM_COMMIT, PAGE_EXECUTE_READWRITE);

  ItemCount:=ListView_GetItemCount(ListView);
  logInfo('ItemCount',ItemCount);

  for CurrentPos:=0 to ItemCount-1 do begin
    ListItem.mask:=LVIF_TEXT;
    ListItem.iItem:=CurrentPos;
    ListItem.iSubItem:=0;
    ListItem.pszText:=TmpPC;
    ListItem.cchTextMax:=255;

    // write the prepared item to the other process
    WriteProcessMemory(ph, PListItem, @ListItem, sizeOf(ListItem), c1);

    // ask the item content
    if ListView_GetItem(ListView, PListItem^) then begin
      // read the item string back from the other process and show it
      ReadProcessMemory(ph, TmpPC, @arrCh, 255, c1);
      listBox1.Items.Add(arrCh);
    end;
  end;
  // free the memory of the other process
  VirtualFreeEx(ph, TmpPC, 0, MEM_RELEASE);
  VirtualFreeEx(ph, PListItem, 0, MEM_RELEASE);

  // close handle
  CloseHandle(ph);
Ich bin für jede Hilfe dankbar!

cyb
  Mit Zitat antworten Zitat