Entwickler-Ecke

Windows API - ListView aus anderem Programm auslesen


Stefan-M - Fr 21.03.03 13:13
Titel: ListView aus anderem Programm auslesen
Hallo erstmal an alle,

so ist das, da kommt einer neu rein und hat gleich mal eine Frage. Ich würde gern aus einer Listview eines anderen Programms die selektierte Liste auslesen.
Kann mir jemand helfen? Hab in Ansätzen da schon einiges erlesen können hier, aber wirklich weitergeholfen hat mir das nicht sehr.
Die ID der Komponente hab ich.

Gruss
Stefan


Delete - Fr 21.03.03 13:30

ID Komponenten? Na egal.

Du brauchst ein Handle auf den Listview, um entsprechende Nachrichten an ihn zu senden. Das Problem ist: Der Listview gehört zu den CommonControls, welche erst ab Win95 dazu kamen. Edit-Felder, Listboxen usw. gab es schon unter Win3.11. Dort liefen die Anwendungen noch nicht in streng abgtrennten Adressräumen, so das man von einer Anwendung auf den Adressraum einer anderen Anwendung zu greifen konnte. Aus kompatibilitäts Gründen hat es Microsoft es so hingebogen, dass solche Nachrichten (Nachrichten an Edits, Listboxen usw.) erkannt werden und in einen gemeinsamen Adressraum gemappt werden, dass auch unter Win32 solche Anwendungen, die so was machen, funktionieren.
Da der Listview ein "neues" Kontroll-Elemet ist, hat Mircosoft dies dort nicht implementiert. Es läuft also daraufhinaus, dass du deinen Code in den Adressraum des Prozesses mit dem Listview injezieren mußt und das geht mit einer DLL.


Motzi - Fr 21.03.03 13:53

Oder aber mit VirtualAllocateEx speicher im andren Prozessraum reservieren in dem dann die Daten abgelegt werden und diese dann mit ReadProcessMemory auslesen...


Stefan-M - Fr 21.03.03 14:06

hmmm...
Das mit dem Adressraum wird schwierig, denn woher weiss ich, wo das andere Programm die Listview-daten ablegt?

Mit ID der Komponente habsch so ein wenig was gemixt, was vielleicht nicht so zusammengehört. Ich meinte eben mit ID die ID der Listview. Und weils in Delphi eine Komponente gibt, hab ich eiinfach mal dieses Wort verwendet.

Aber danke erstmal, ich probier mal rum.

Stefan


Delete - Fr 21.03.03 14:09

Es gibt in Delphi eine Komponente mit dem Namen ID? :shock:


Stefan-M - Fr 21.03.03 14:17

naja man könnte im weitesten sinne die indy komponenten zu den solchen zählen :o)

Aber sag mal, du meinst doch nicht jetzt wirklich, dass ich mich so mistverständlich ausdrücke.
jedes element hat doch ein handle und eine id, wobei die id immer dieselbe ist. hab ich aus deinem programm übrigens (honigumdenmundschmierenderweise).


Delete - Fr 21.03.03 14:21

Stefan-M hat folgendes geschrieben:
Aber sag mal, du meinst doch nicht jetzt wirklich, dass ich mich so mistverständlich ausdrücke.

Eigentlich shcon. Sorry.
Zitat:

jedes element hat doch ein handle und eine id, wobei die id immer dieselbe ist.

Was hat die ID des Controlls mit dessen Bezeichnung zu tun?


Stefan-M - Fr 21.03.03 14:26

oooch ich glaub, das ist doch jetzt egal. ich werd mich das nächste mal besser ausdrücken - versprochen.


Motzi - Fr 21.03.03 15:40

Stefan-M hat folgendes geschrieben:
hmmm...
Das mit dem Adressraum wird schwierig, denn woher weiss ich, wo das andere Programm die Listview-daten ablegt?

Ganz einfach.. die Message um die Daten zu bekommen hat einen Parameter, der einen Pointer auf einen Speicherbereich darstellt, in den die Listview die Informationen hineinschreibt. Mit VirtualAllocateEx reservierst du den Speicher und bekommst die Adresse des Speicherblocks. Diese Adresse kommt jetzt als Parameter mit der Message mit. Und dann kannst du einfach mit ReadProcessMemory die Daten auslesen...