Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Auslesen einer fremden ListView (Texte sind manchmal leer, je nach ListView-Klasse) (https://www.delphipraxis.net/162649-auslesen-einer-fremden-listview-texte-sind-manchmal-leer-je-nach-listview-klasse.html)

cyberia 1. Sep 2011 08:57

Auslesen einer fremden ListView (Texte sind manchmal leer, je nach ListView-Klasse)
 
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

Assarbad 10. Apr 2012 23:25

AW: Auslesen einer fremden ListView (Texte sind manchmal leer, je nach ListView-Klass
 
Zu wenig Info. Fehlercodes, Fehlercodes, Fehlercodes!!!

Handelt es sich bei den Zielanwendungen um privilegierte Prozesse, bei deinem aber nicht? 32bit vs. 64bit? Filtert die Zielanwendung vielleicht sogar die Fensternachrichten von externen Quellen (geht seit Vista)?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz