Fremde Anwendung: ListView-Komponente auslesen [gelöst]

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Fremde Anwendung: ListView-Komponente auslesen [gelöst]

Beitrag von Sicro »

Hallo zusammen,

ich möchte von einem fremden Programmfenster den Inhalt einer ListView-Komponente auslesen.

Folgende Vorgehensweise funktioniert ja nur, wenn man die ListView der eigenen Anwendung auslesen möchte:

Code: Alles auswählen

Count = SendMessage_(Handle,#LVM_GETITEMCOUNT,0,0)
If Count
  For i = 0 To Count - 1
    Buffer.s = Space(255)
    
    Item.LV_ITEM
    With Item
      \iSubItem = 6
      \pszText = @Buffer
      \cchTextMax = Len(Buffer)
    EndWith
    
    Length = SendMessage_(Handle,#LVM_GETITEMTEXT,i,@Item)
    If Length
      Debug Left(Buffer,Length)
    EndIf
  Next
EndIf
Wie muss ich vorgehen, damit es mit fremden Programmfenstern geht?

Vielen Dank

Mfg DerProgger
Zuletzt geändert von Sicro am 17.03.2007 20:58, insgesamt 1-mal geändert.
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag von Sicro »

Ich habe die Vorgehensweise herausgefunden. :)

Für alle, die ebenfalls fremde ListView-Komponenten auslesen möchten, habe ich eine Prozedur zusammengestellt:

Code: Alles auswählen

Procedure.s GetItemText(Handle.l,Row.l,Col.l)
  Protected ProcessID.l, Process.l
  Protected *Item.LV_ITEM, Item.LV_ITEM
  Protected Buffer.s = Space(255)
  
  GetWindowThreadProcessId_(Handle,@ProcessID)
  Process = OpenProcess_(#PROCESS_VM_OPERATION | #PROCESS_VM_READ | #PROCESS_VM_WRITE,#False,ProcessID)
    
  *Item = VirtualAllocEx_(Process,0,4096,#MEM_COMMIT | #MEM_RESERVE,#PAGE_READWRITE)
  
  With Item
    \mask = #LVIF_TEXT
    \iItem = Row
    \iSubItem = Col
    \pszText = *Item + SizeOf(LV_ITEM)
    \cchTextMax = 255
  EndWith
  
  WriteProcessMemory_(Process,*Item,@Item,SizeOf(Item),0)
  SendMessage_(Handle,#LVM_GETITEM,0,*Item)
  ReadProcessMemory_(Process,*Item + SizeOf(LV_ITEM),@Buffer,Len(Buffer),0)
    
  VirtualFreeEx_(Process,*Item,0,#MEM_RELEASE)
  CloseHandle_(Process)
  
  ProcedureReturn Buffer
EndProcedure
Mfg DerProgger
Antworten