Comment lister un syslisteview d'une application externe dans une list box ?

Signaler
Messages postés
8
Date d'inscription
samedi 25 août 2007
Statut
Membre
Dernière intervention
2 septembre 2007
-
Messages postés
8
Date d'inscription
samedi 25 août 2007
Statut
Membre
Dernière intervention
2 septembre 2007
-
Bonjour,


je suis débutant en matiere de programmation et je travail sous Borland c++ builder ,et je


souhaite savoire comment peut on extraire les items d'une syslisteview située dans une aute


application que la mienne et metre les items dans une listbox1 de mon application,je sais


qu'il faut utiliser LVM_GETITEMTEXT comme message, mais comment ! je sais pas !
dans mon programme je place dans la fiche un Button1 et une ListBox1,
pourriez vous m'indiquer le code a metre dans le Button1 c'est a dire dans :
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// ici        
}

et merci d'avance.

9 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Salut,

Bah il te faut surtout le handle de fenêtre du contrôle (Souvent appelé hwnd).

La msdn précise bien comment employer ce message.

Pour récupérer le handle de fenêtre du contrôle, il te faudrat bien connaître la structure de fenêtre de l'application tierce, par exemple avec spy++, puis utiliser par exemple EnumWindows/EnumChildWindows dans ton programme.
Messages postés
8
Date d'inscription
samedi 25 août 2007
Statut
Membre
Dernière intervention
2 septembre 2007

une fois que j'ai le handle ,comment utiliser cette fonction;
franchement je sais pas quoi metre dans (LPARAM) lParam ; en plus faut il d'autre fonctions pour acceder au syslistview de l'application externe ou un sendmessage avec LVM_GETITEMTEXT suffi ?
Messages postés
8
Date d'inscription
samedi 25 août 2007
Statut
Membre
Dernière intervention
2 septembre 2007

fonction =


lResult = SendMessage(,
    // returns LRESULT in lResult,

----

   (HWND) hWndControl,,
    // handle to destination control,

----

   (UINT) LVM_GETITEMTEXT,,
    // message ID,

----

   (WPARAM) wParam,,
    // = (WPARAM) (int) iItem;,

----

   (LPARAM) lParam,
    // = (LPARAM) (LPLVITEM) pitem;
 que faut il metre dans (LPARAM) lParam ; et comment acceder a la syslistview de l'autre application ? le handle lui seule suffi ?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Une fois que tu as le handle, SendMessage suffit.
Commence par mettre 0 dans lparam.

En WPARAM, il faut mettre l'adresse d'une struture LVITEM à ce que j'ai compris.

Tout est expliqué sur le lien que je t'ai donné.
Messages postés
8
Date d'inscription
samedi 25 août 2007
Statut
Membre
Dernière intervention
2 septembre 2007

j'avoue que j'ai pas bien compris,mais c'est quoi structure LVITEM ?
Donne moi tout petit example svp
et merci pour votre aide .
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
LVITEM, c'est une structure qui va acceuillir les infos suite à ton LVM_GETITEMTEXT.



Le texte contenu dans l'item sera pointé par le membre pszText de cette structure.

Cette structure tu t'en sers un peu comme un saut, et c'est le SendMessage qui va le remplir, avec notamment le texte de l'item.

Pour le petit exemple, j'ai un peu la flemme, pas VC2005 sur ce poste, et pas trop le temps chez moi. Mais ça doit tout bêtement ressembler à ça :

LVITEM item;

// Récupération du hwnd

if (FAILED(SendMessage(hwnd, LVM_GETITEMTEXT, 0, (LPARAM)&item))
{
// Echec
}
else
{
// Le texte de l'item est pointé par item.pszText
}
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
saut -> seau
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
rt15 >> ramanovitch a précisé que la listview se trouve dans une autre application. Il s'agit donc d'un autre processus. Ta méthode ne fonctionnerait pas car le pointeur sur LVITEM ne sera pas valide dans le contexte mémoire de l'autre application. Il faudra donc obtenir le PID du processus cible avec GetWindowThreadProcessId(). Obtenir ensuite le HANDLE de ce processus avec OpenProcess(). On devra alors y  allouer de la mémoire qui contiendra LVITEM, avec son buffer pour le texte, en utilisant VirtualAllocEx(). Cest le pointeur retourné par cette fonction qui servira de dernier paramètre pour SendMessage(). On lira ensuite le contenu de la zone mémoire avec ReadProcessMemory(). Cette dernière copie les données dans un buffer local à notre application. Pour finir on libère la zone allouée avec VirtualFreeEx() et le HANDLE du processus avec CloseHandle().
Messages postés
8
Date d'inscription
samedi 25 août 2007
Statut
Membre
Dernière intervention
2 septembre 2007

j'ai enfin trouvé la solution :


dans l'environnement builder c++ , on place le code suivant dans le on click du button1 afin de reccuperer les items de syslistview dont on a le handle "hwnd" et les metre dans ListBox1; le code est :
void __fastcall TForm1::Button1Click(TObject *Sender)
{
listview = hwnd ; // on met le handle de syslitview dans listview

int count=(int)SendMessage(listview, LVM_GETITEMCOUNT, 0, 0);
int i;


LVITEM lvi, *_lvi;
char item[512], subitem[512];
char *_item /* , *_subitem */; /* pour subitem = 0 dans ce cas on va avoire les items de la 1ere colone */
unsigned long pid;
HANDLE process;


GetWindowThreadProcessId(listview, &pid);
process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|
PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);


_lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),
MEM_COMMIT, PAGE_READWRITE);
_item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
PAGE_READWRITE);
/* _subitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
PAGE_READWRITE);  */


lvi.cchTextMax=512;


for(i=0; i<count; i++) {
lvi.iSubItem=0;
lvi.pszText=_item;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);


ReadProcessMemory(process, _item, item, 512, NULL);




ListBox1->Items->Add(item); //*********** ici j'ajoute les items dans ListBox1
}
VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
VirtualFreeEx(process, _item, 0, MEM_RELEASE);
}