Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

EXTRAIRE LE TEXTE DES FENETRES D'APPLICATIONS TIERCES (LISTBOX, LISTVIEW, TEXTBOXES, ...)


Information sur la source

Catégorie :API Classé sous : Extraire, Listbox, GetWindowText, Sendmessage, liste Niveau : Débutant Date de création : 17/04/2008 Date de mise à jour : 13/05/2009 14:14:36 Vu / téléchargé: 6 539 / 636

Note :
9,25 / 10 - par 4 personnes
9,25 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (30)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
une mini source
mais assez utile, dans certains cas...

cas concrêt: j'ai une appli au boulot qui log ses erreurs dans une zone de liste (oui, une listbox, quoi ^^)
j'ai besoin de faire d'infos de ces logs... et le travail manuel, c'est pas mon dada


 

Source

  • ' code trop long, depuis qu'il gère d'autres types de fenetre
  • ' => voir ZIP
' code trop long, depuis qu'il gère d'autres types de fenetre
' => voir ZIP

Conclusion

et voilà !

il suffit de faire un Drag & Drop du label sur la fenêtre  notre choix pour que tous les elements se retrouvent dans notre TextBox.
ensuite, vive le presse-papier !

sont gérés:
ListBox (avec Checkbox ou non)
ComboBox
TextBox
ListView
TreeView
...
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

17 avril 2008 16:05:41 :
Changement d'une propriété dans le projet
17 avril 2008 16:13:46 :
légère amélioration viisuelle (pas de refresh si on survolle toujours le même fenetre cible)
21 avril 2008 13:03:11 :
Le code gère plus de type de fenêtre (notament les ListView)
22 avril 2008 15:26:21 :
Ajout de la gestion des TreeViews
22 avril 2008 16:13:30 :
Correction de la déclaration de l'API VirtualFreeEx
22 avril 2008 16:16:50 :
probleme de Zip
13 mai 2009 14:14:37 :
gestion des checkboxes dans les listboxes

Commentaires et avis

signaler à un administrateur
Commentaire de muad-dib le 19/04/2008 23:13:07

Pardon mais je ne saisis pas bien le but du programme?

signaler à un administrateur
Commentaire de Renfield le 20/04/2008 06:06:19 administrateur CS

Récupérer facilement dans une TextBox la liste des elements situés dans une ListBox.
En effet, depuis une TextBox, il est possible de modifier ces éléments, de faire un copier coller...

J'ai fait cette mini source pour le boulot: comme je l'ai expliqué, j'ai une appli au boulot qui affiche ses messages de log dans une zone de liste.
j'avais besoin d'envoyer un rapport par mail, basé sur des infos contenues dans la log.

plutot que de recopier a la maon les infos dont j'avais besoin, j'ai préféré un outil simple a mettre en oeuvre... (un simple drag & drop)

signaler à un administrateur
Commentaire de oommeeggaa3d le 21/04/2008 09:14:10 9/10

Excellent et ça donne des idées !
Mais ça manque un peu de commentaires.

signaler à un administrateur
Commentaire de oommeeggaa3d le 21/04/2008 09:31:14

Pour tester avec une listbox d'un projet VB6 j'ai dû utiliser ThunderListbox à la place de Listbox. Ca marche nickel.
Par contre je n'arrive pas à modifier le programme pour un textbox.
J'imagine que ça ne doit pas être super compliqué ?

signaler à un administrateur
Commentaire de Renfield le 21/04/2008 11:29:19 administrateur CS

Je suis en train d'ajouter la gestion de quelques types de fenetre supplémentaires

signaler à un administrateur
Commentaire de Renfield le 21/04/2008 13:06:34 administrateur CS

reste le Treeview, mais pas le temps, dans l'immédiat.

amusez vous bien aec cet update

signaler à un administrateur
Commentaire de oommeeggaa3d le 21/04/2008 14:07:00

Merci bien, c'est du joli boulot. et bien commenté cette fois ;-)

pour les listview, la récupération des colonnes et subitems fonctionnent aussi si SendMessage(vhWnd, LVM_GETVIEW, 0, ByVal 0&) renvoie 0 (mode lviewreport).

signaler à un administrateur
Commentaire de Renfield le 21/04/2008 14:16:40 administrateur CS

Si tu es en mode report, l'export te donnera les colonnes
si tu es dans un autre mode tu vas obtenir un mode list (tous les elements a la ligne)

pour ton "renvoie 0" , je suis pas sur de piger...  en effet,  Const lvwReport = 3

signaler à un administrateur
Commentaire de oommeeggaa3d le 21/04/2008 14:26:49

je te donne le détail, ça sera peut-être plus clair :
j'ai créé dans un autre projet une listview configurée en mode lvwReport.
Il y a trois colonnes et des entêtes de colonnes.
Mais ton programme ne me renvoyait que le contenu de la 1ère colonne.
J'ai donc visualisé la valeur renvoyée dans ton programme par sendMessage(vhWnd, LVM_GETVIEW, 0, ByVal 0&) et c'était 0. En modifiant le test sur cette valeur, j'ai pu obtenir les contenus de mes 3 colonnes et leur entêtes.
En tout cas, ça marche du tonnerre, et c'est également une nouvelle façon de récupérer les infos d'un explorateur windows. (avec plus de détails que dans ma dernière source qui ne récupérait que les noms de fichiers via le clipbpoard)

signaler à un administrateur
Commentaire de oommeeggaa3d le 21/04/2008 14:28:15

il s'agit d'une listeview de type : ListView20WndClass

signaler à un administrateur
Commentaire de Renfield le 21/04/2008 14:34:10 administrateur CS

On peut même supprimer ce test :

            ...
            '# On récupère l'entete
            hHeader = SendMessage(vhWnd, LVM_GETHEADER, 0, ByVal 0&)
            If hHeader Then
                '# Le nombre de colonnes
                nColUbound = SendMessage(hHeader, HDM_GETITEMCOUNT, 0, ByVal 0&) - 1
                
                ...
            End If
            ...

signaler à un administrateur
Commentaire de oommeeggaa3d le 22/04/2008 10:57:12

Je sens que je vais utiliser ta source dans mon logiciel de multi-presse-papier !

Je vais tenter la gestion des treeview. As-tu essayé ?

signaler à un administrateur
Commentaire de Renfield le 22/04/2008 11:12:37 administrateur CS

non, pas eu le temps, mais ca ne doit pas etre complexe.... se baser sur ce que j'ai fait sur les listview, pour aller jouer dans l'espace mémoire du process cible, lui demander des Nodes, etc...

signaler à un administrateur
Commentaire de oommeeggaa3d le 22/04/2008 12:30:44

Pour ma culture perso :
pourquoi ne peut-on pas faire : (psztext as string)
et se passer d'allouer de la mémoire ?

Private Type LVITEM
mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
pszText As STRING
cchTextMax As Long
iImage As Long
lParam As Long
iIndent As Long
iGroupId As Long
cColumns As Long
puColumns As Long
End Type

signaler à un administrateur
Commentaire de Renfield le 22/04/2008 13:22:08 administrateur CS

dans l'absolu, oui, mais il faudrait tout de même faire
    pszText = Space$( 512 )
pour allouer de la mémoire.

le String est interpreté lors de l'appel à l'API. Celle-ci recevra un pointeur mémoire vers les caractères...
mais ce pointeur ne désignerai pas une adresse valide dans l'espace mémoire du processus cible...

c'est pour cela que l'on fait des VirtualAlloc, etc ; pour que le pointeur désigne une adresse mémoire conforme, dans l'espace mémoire du processus en charge de relmplir notre LVITEM

signaler à un administrateur
Commentaire de oommeeggaa3d le 22/04/2008 13:29:23

Merci à toi.
j'ai compris.

Je finis le code pour les treeview et je le mets ici, si tu n'as pas le temps de la faire.

signaler à un administrateur
Commentaire de oommeeggaa3d le 22/04/2008 14:20:28

Pour les treeview, j'ai donc ajouté le code suivant.
Avec le treeview de l'explorateur Windows, cela fonctionne parfois, mais pas toujours (!). Idem pour la listview de l'explorateur.

If InStr(1, ";SysTreeView32;TreeView20WndClass;", ";" & sClass & ";", vbTextCompare) Then
          GetWindowThreadProcessId vhwnd, nPid
          hprocess = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE Or PROCESS_QUERY_INFORMATION, False, nPid)
          If hprocess <> -1 Then
            tv = TreeView_GetRoot(vhwnd) 'noeud racine
            'vsresult = get_treeview_item_text(vhwnd, hprocess, tv) & vbNewLine 'récupération du nom
            'tv = TreeView_GetChild(vhwnd, tv) 'on se place sur son premier fils
            vsresult = vsresult & get_treeview_text(vhwnd, hprocess, tv, 0) 'on demande la récupération de l'arbre à partir de ce permier fils
            CloseHandle hprocess
End If

Public Function TreeView_GetRoot(hwnd As Long) As Long
TreeView_GetRoot = TreeView_GetNextItem(hwnd, 0, TVGN_ROOT)
End Function

Public Function TreeView_GetChild(hwnd As Long, hItem As Long) As Long
TreeView_GetChild = TreeView_GetNextItem(hwnd, hItem, TVGN_CHILD)
End Function

Public Function TreeView_GetNextItem(hwnd As Long, _
hItem As Long, _
flag As Long) As Long
TreeView_GetNextItem = SendMessage(hwnd, _
TVM_GETNEXTITEM, _
flag, _
ByVal hItem)
End Function

'pour récursivité
Private Function get_treeview_text(vhwnd As Long, hprocess As Long, ByVal tv As Long, level As Integer) As String
Dim vsresult As String
Dim tmp As String
While tv <> 0
  vsresult = vsresult & String(level, vbTab) & get_treeview_item_text(vhwnd, hprocess, tv) & vbNewLine
  tmp = get_treeview_text(vhwnd, hprocess, TreeView_GetChild(vhwnd, tv), level + 1)
  vsresult = vsresult & tmp
  tv = TreeView_GetNextItem(vhwnd, tv, TVGN_NEXT)
Wend
get_treeview_text = vsresult
End Function

Private Function get_treeview_item_text(vhwnd As Long, hprocess As Long, tv As Long) As String
Dim tvi As TVITEM
Dim mem As Long
Dim nLength As Long
Dim sBuffer As String
With tvi
  .mask = TVIF_TEXT
  .cchTextMax = 512
End With
sBuffer = Space$(512)
tvi.pszText = VirtualAllocEx(hprocess, ByVal 0&, 512, MEM_COMMIT, PAGE_READWRITE)
mem = VirtualAllocEx(hprocess, ByVal 0&, LenB(tvi), MEM_COMMIT, PAGE_READWRITE)
tvi.hItem = tv
WriteProcessMemory hprocess, ByVal mem, tvi, LenB(tvi), nLength
Call SendMessage(vhwnd, TVM_GETITEM, 0&, ByVal mem)
ReadProcessMemory hprocess, ByVal tvi.pszText, ByVal sBuffer, 512, ByVal 0&
On Error Resume Next
get_treeview_item_text = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)
On Error GoTo 0
VirtualFreeEx hprocess, mem, 0, MEM_RELEASE
VirtualFreeEx hprocess, tvi.pszText, 0, MEM_RELEASE
End Function

signaler à un administrateur
Commentaire de oommeeggaa3d le 22/04/2008 14:43:13

Précision : ça ne fonctionnait plus avec mon explorer
mais en tuant/relançant le process, tout est revenu dans l'ordre (j'ai dû faire des fuites mémoires en débuguant mon bout de code)

Quand on récupère le treeview de l'explorateur, on ne récupère en fait que ce qui a déjà été affiché dans ce treeview.
En clair, on ne récupère pas toute l'arborescence du disque dur, mais seulement les répertoires déjà parcouru.

signaler à un administrateur
Commentaire de oommeeggaa3d le 22/04/2008 15:13:57

encore moi ...
après "enquête", j'ai bien l'impression qu'il y a une fuite mémoire.
J'ai essayé avec différents processus (explorateur, taskmanager ...), la mémoire utilisée augmente à chaque requête de ton programme, mais n'est pas libérée apparemment.

signaler à un administrateur
Commentaire de Renfield le 22/04/2008 15:27:12 administrateur CS

j'ai intégré la gestion des TreeViews
regarde si tu as toujorus le même soucis...

signaler à un administrateur
Commentaire de oommeeggaa3d le 22/04/2008 15:31:23

Ouf, le problème peut se régler :
Le souci vient de là :

http://www.vbfrance.com/infomsg_VIRTUALFREEEX-SUITE_147596.aspx#1

signaler à un administrateur
Commentaire de Renfield le 22/04/2008 16:11:54 administrateur CS

probleme corrigé...

effectivement, la déclaration d'APIs de VirtualFreeEx etait fausse: le parametre Size était passé par référence...
il faut donc lui donner ByVal 0&
ou modifier la déclaration

signaler à un administrateur
Commentaire de AGG le 04/05/2008 12:56:47 10/10

Excellent !

signaler à un administrateur
Commentaire de PCPT le 23/05/2008 16:25:10 administrateur CS

dommage, la ListBox cochable de WindowsUpdate n'est pas supportée :(

signaler à un administrateur
Commentaire de beebopcmoi le 29/09/2008 18:13:42

Genial :)
Après bien des recherches, enfin un code qui permet d'extraire le contenu d'un treeview... Bravo :)

Sans vouloir abuser... je travaille sur un treeview d'une application externe, qui affiche des textes en couleur et en gras ou non... je cherche un bout de code (en plus) qui me dirait pour chaque item s'il est en gras, en italique, et sa couleur...
C'est possible ca?

signaler à un administrateur
Commentaire de Renfield le 30/09/2008 05:15:17 administrateur CS

voir la valeur de state, dans les TVITEM.
TVIS_BOLD => controle le gras.

voir ici. http://msdn.microsoft.com/en-us/library/ms913992.aspx


signaler à un administrateur
Commentaire de beebopcmoi le 02/10/2008 16:47:54

J'ai besoin de lire un certain nombre d'informations sur le treeview32 d'une
application externe:
Pour chaque item, je veux connaitre:
- Le texte de l'item
- La couleur de ce texte
- Si le texte est BOLD ou non
- L'icone affichée a coté de l'item

Grace a ce programme,j'ai pu extraire le code qui me donne le résultat suivant :

Racine1
item1
item2
Racine2
item3

Je cherche donc a obtenir un résultat qui donnerait :

Racine1, IsBold, IndexTextColor, IndexIcone
item1, IsBold, IndexTextColor, IndexIcone
item2, IsBold, IndexTextColor, IndexIcone
Racine2, IsBold, IndexTextColor, IndexIcone
item3, IsBold, IndexTextColor, IndexIcone

je ne suis pas un fin connaisseur des allocations mémoires ou du subclassing, et
je ne comprend pas tout aux getitem / getitemstate, TVIF_STATE, TVIS_BOLD et compagnie...
Je pense qu'à partir d'un exemple pour extraire le Bold, j'arriverais a tirer les autres informations, mais j'ai beau avoir bricolé de plusieurs facons, je n'arrive pas a extraire la moindre information supplémentaire

Auriez-vous un exemple d'application? une fonction IsItemBold(...) a rajouter a ce programme?

signaler à un administrateur
Commentaire de Renfield le 04/10/2008 18:21:06 administrateur CS

la couleur me semble complexe a obtenir. la reste ca devrait aller

signaler à un administrateur
Commentaire de beebopcmoi le 05/10/2008 13:23:27 9/10

oui effectivement, j'ai finalement réussir a extraire le Bold du treeview :) ne déchiffrant qu'a grande peine ton code, j'intervertissais les handles du treeview et de l'item, honte a moi... mais j'avoue que concernant la couleur et l'identifiant de l'icone, je n'obtiens rien... Je pense que le treeview en question a été implémenté par d'autres fonctions, et j'ignore comment lui poser les bonnes questions.... :s
Si jamais tu es interressé par la question, je peux éventuellement te dire ou trouver ce treeview, si tu veux y jeter un oeil un peu plus expérimenté que le mien :) Je suis dispo en messagerie

note : sur chaque item, une infobulle regroupe toutes les informations qui m'intéressent, et j'arrive à lire ces infobulles, mais uniquement lorsqu'ils existent, et ils n'existent que ponctuellement, lorsque ma souris traine dessus... S'il y avait éventuellement une manière de forcer la création de ces bulles, que je puisse les lire....

signaler à un administrateur
Commentaire de CADRATURE le 10/01/2009 00:13:23 9/10

Super

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Comment copier le contenu d'une listbox ? [ par Rodo22 ] Bonjour,Admettons que j'ai une liste de trois éléments. Comment puis-je copier la liste dans le presse-papiers ? J'ai essayé avec la commande for...ne ListBox ordonnée [ par Luke ] BonjourJ'ai un dbcombo qui est chargé avec une liste de mots pris dans une base de données access 97. Lorsque je clik sur le DBCombo pour faire le cho Gérer 3 listbox [ par bruno ] J'ai 3 listbox,avec un liste de noms dans la 1ère.Je voudrais mettre les noms masculins dans la liste 2 et les noms féminins dans la 3.J'ai utilisé la Comment extraire les données du champ... [ par Akhilleus62 ] Salut,Je planche sur un petit convertisseur de base de données access (francs/euros) et j'ai un petit souçi. J'ai trois listbox. Le 1er affiche bien l Comment mettre une image ou pas !! :) [ par scoobydoos ] Salut,Voila j'ai d'un coté une ListBox et de l'autre une boite Image. Je voudrais quand je clique sur la liste de la ListBox affiché une image (qui a listbox avec un style = 1 (checkbox) [ par startx25 ] sous vb5 y'a moyen d'insérer un listbox avec comme style = 1 pour "checkbox" ce qui donne une liste d'élément avec pour chacun un checkbox. le problèm pb de creation listbox a pl colonnes [ par PDT ] je voudrais creer une listbox à deux colonnes mais ca ne marche pas mon code est le suivant :liste.columns = 2set db = opendatabase("base.mdb")reqlist SOS listBox [ par doudou ] Bonjour,Mon problème est le suivant:Je souhaiterais faire apparaître une zone de liste dans une dia sous powerpoint(cette application doit me permettr Somme d'une liste [ par chimeres ] Bonjour à tous,je cherche à faire quelquechose mais je ne sais pas si c'est en fait possible : j'aimerai aditionner chacune des valeurs numériques d'u SendMessage et ListBox [ par MrDogbert ] SalutY a t il un moyen d'utiliser la fonction :Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,328 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.