Click auf ein Element in einer SysListView32 simulieren

greggy80

Mitglied
Folgendes Problem:

Ich habe aus einer externen Anwendung ein Handle für eine SysListView32. Dort sind ein paar Elemente drin. Ich möchte nun diese Liste durchlaufen und auf jedes Element einen Maus-Klick simulieren.
Mit einer TreeView ging dies über den Befehl TreeView_SelectItem(), für ListViews gibt es aber nichts äquivalentes.
Ich habe es bereits mit ListView_SetItem und ListView_SetItemState versucht. Diese liefern mir auch true, aber die Selektion ändert sich nicht und der "Klick" auf das Element wird ebenfalls nicht ausgeführt.

Kann mir jemand Code für eine solche Funktion geben, die einen ItemIndex erhält und auf das assoziierte Element einen Klick ausführt (die Selektion ist optional, wäre aber von Vorteil).

Vielen Dank für eure Lösungen oder Anregungen,

David
 
Hallo,

SysListView32 sagt mir jetzt nichts, aber wenn es sich um ein normales ListView handelt, schaue weiter unten in der Thread "List Ctrl Probleme". Dort sind die Antworten.
Du mußt dir nur den Zeiger auf das gekapselte ListCtrl holen und damit arbeiten.

Mfg

langer
 
Ok, ich lass jetzt mal die Katze aus dem Sack:

Ich möchte dem PartyPoker-Programm die Tischlisten entlocken und versuche, ein Item nach dem anderen zu markieren. Aber wie auch immer ich das versuche, es klappt nicht. Wenn ich auf eine ListView vom Datei-Browser beispielsweise zugreife, funktioniert das ListView_SetItemState() umstandslos. Nur bei dieser Tischliste im PartyPoker Programm nicht.
Falls jemand dieses Programm auf seinem Rechner hat und mir einen Gefallen tun würde, dann checkt er einmal, ob es bei ihm auch nicht klappt. Vielleicht liegt es ja an meinem Rechner.

Andere FishFinder Programme kriegen die Listen ja auch gelesen und bewegt, warum sollte das bei mir dann nicht klappen... ich bin ratlos.

Im WinSpector habe ich mal beobachtet, dass auf die ListView permanent Messages geworfen werden à la LVM_GETITEMW und LVM_GETNEXTITEM. Und das in einer hohen Frequenz. Könnte es daran liegen, dass sich die Items nicht markieren lassen? Und eine andere Frage: wie kann man es verhindern, dass diese Messages permanent geworfen werden?! Gibt es eine Möglichkeit, sowas abzufangen/zu verhindern?

Und noch eine kleine Frage nebenbei: worin liegt der Unterschied zwischen LVM_GETITEM und LVM_GETITEMW?
 
Jetzt habe ich eine weitere Anomalie feststellen müssen: mein Programm funktioniert, wenn ich bestimmte Zeilen im Code lasse... z.B. absolute trash-anweisungen wie

Code:
struct t3
{
   LVITEM it;
   char buf[77];    //Unter 285 funktioniert es, ab 285 nicht mehr
                       //Unter 77 funktioniert es ebenfalls nicht mehr
                       //Diese Anomalie kann nicht PC-unabhängig sein und hängt
                       //vielleicht von der Taktfrequenz des Rechners ab
};


[...]
            //Es folgt Müll, den man aber braucht, damit ein paar Zeilen später SetItemState funktioniert
            void* t;
            void* t2;
            t3 t3;
[...]
            ListView_SetItemState(p.hwnd_tablelist, i, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
[...]
Ich bin extrem verwirrt und habe mich noch nie über Programmierung so geärgert wie in den letzten Tagen.
Lustig ist auch: wenn ich zu viele Variablen Deklarationen mache, funktioniert es "manchmal" auch nicht mehr. Was kann das nur sein?
Ich habe geguckt, ob ich irgendwo nicht vernünftig Speicher freigebe, aber es scheint alles ok zu sein - der Taskmanager zeigt auch keine Veränderungen des Speichers an für meine EXE-Datei.
 
Hi,

LVM_GETITEM ist die die Standard-Message. Daraus macht der Compiler z.B. bei Unicode LVM_GETITEMW und bei ANSI LVM_GETITEMA.

Was das Problem mit den ständigen Messages anbelangt, kann ich mir nur vorstellen, dass irgendwo eine Schleife läuft, wo die Abbruchbedingung nicht erreicht wird.

Mfg

langer
 
Zurück