PDA

View Full Version : [C++] Prendere del testo da un controllo SysListView32


MAdSimon
28-07-2009, 13:10
Salve a tutti,

Sto facendo un'app in DevC++ per prendere una lista di ip da un programma di VPN. Questo mi servirà in seguito per fare un giochino multiplayer, che avendo già gli ip dei giocatori potrà effettuare da solo le connessioni senza dover fare il solito scambio di ip.

Finora sono riuscito a prendere l'handle della finestra principale del programma con FindWindow(). Poi con FindWindowEx() ho preso l'handle del controllo che tiene la lista degli ip.

Il controllo che contiene gli ip è un SysListView32. Sono sicuro che l'handle del controllo è corretto, perchè se mando un messaggio TVM_GETCOUNT con SendMessage() mi torna il numero esatto di items.

Il punto è che a me serve il testo degli items stessi. Per prendere il testo bisogna mandare un messaggio TVM_GETITEM, che come parametro in/out ha una struct TVITEM che deve contenere l'handle dell'item di cui si vogliono ottenere gli attributi. Dopo aver inviato il messaggio, la struct conterrà i dati dell'item.

Io l'handle degli item non ce l'ho, ho solo l'handle del controllo. So che esiste il messaggio TVM_GETNEXTITEM, che però ha bisogno anch'esso come parametro di un handle ad un item ( per trovare il successivo, quello selezionato o altri ).

Come faccio a trovare l'handle del primo item? :help:

Grazie in anticipo

kk3z
29-07-2009, 09:49
TVITEM è una struttura che ti serve per le treeview (TV = TreeView), la struttura che cerchi è LVITEM, il messaggio da inviare è LVM_GETITEM.

L'unica cosa che devi settare è iItem:
TCHAR text[255];

LVITEM li = {0};
li.mask = LVIF_TEXT; //devi ricavare il testo
li.iItem = [numero dell'elemento];
li.pszText = text;
li.cchTextMax = 255;
SendMessage(listView, LVM_GETITEM, 0, (LPARAM)&li)

C'è comunque un altro problema più grosso, cioè che la struttura LVITEM che allochi è nello spazio del tuo processo, mentre la listview è in un altro processo, quindi non funzionerà. Guarda qui per sapere perchè e trovare una soluzione: http://www.codeproject.com/KB/shell/ctrayiconposition.aspx (è per una toolbar, ma il metodo è lo stesso)

MAdSimon
29-07-2009, 18:40
Scusa ho sbagliato a scrivere il controllo è un SysTreeView32. Nella struttura TVITEM non va messo un int che indica quale item prendere, ma un handle di tipo hItem. Era quello il mio problema, TVM_GETITEM prende gli attributi di un item, ma di quale item glielo devo dire io passando l'handle hItem, che non so come procurarmi :mbe: Riguardo all'allocazione esterna cmq è tutto chiaro, grazie :)