begin process at 2012 02 13 20:39:56
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :Extraire, Listbox, GetWindowText, Sendmessage, liste Niveau :Débutant Date de création :17/04/2008 Date de mise à jour :24/11/2009 05:35:55 Vu / téléchargé :8 877 / 867

Auteur : Renfield

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (36)
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

Les Membres Club peuvent 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
24 novembre 2009 05:35:55 :
Ajout d'un .exe

 Sources du même auteur

Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ...
Source avec Zip Source avec une capture JSON PARSER - ANALYSE DE CHAINES JSON
Source avec Zip Source avec une capture MODULE DE TÉLÉCHARGEMENT DE FICHIER BASIQUE (SYNCHRONE / ASY...
Source avec Zip COURS DE PILOTAGE........D'APPLICATIONS
Source avec Zip CSOCKET - REMPLACEZ WINSOCK PAR LA VERSION 2 DES API

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) .NET DEPENDENCY VIEWER : ARBRE DES DÉPENDANCES D'UN ASSEMBLY... par ShareVB
Source avec Zip Source .NET (Dotnet) UTILITAIRE SKYDRIVE par MasterShadows
Source avec Zip ROTATION RAPIDE D'IMAGE par trex70
Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ... par Renfield
Source avec Zip Source avec une capture MOUSE SPEED AND WEIGHT : RETOUR DE FORCE VIRTUEL ! par ScSami

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) EXPORTER LES IMAGES DE WORD ET D' EXCEL par Le Pivert
Source avec Zip Source avec une capture LISTBOX/LISTVIEW PERSONNALISABLE A VOLONTE par gogomanu
Source avec Zip Source avec une capture AUTRE PETITE FAQ par JLB59
Source avec Zip Source avec une capture UTILISATION DE L'API SENDMESSAGE AVEC UNE LISTBOX OU UN COMB... par PROGRAMMIX
DONNÉES D'UNE LISTBOX VERS UNE FEUILLE EXCEL par ZTPdiffusion

Commentaires et avis

Commentaire de muad-dib le 19/04/2008 23:13:07

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

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)

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.

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é ?

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

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

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).

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

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)

Commentaire de oommeeggaa3d le 21/04/2008 14:28:15

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

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
            ...

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é ?

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...

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

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

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.

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

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.

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.

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...

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

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

Commentaire de AGG le 04/05/2008 12:56:47 10/10

Excellent !

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

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

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?

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


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?

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

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

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....

Commentaire de CADRATURE le 10/01/2009 00:13:23 9/10

Super

Commentaire de Chouchensb le 02/08/2010 23:11:20

Bonjour Renfield,

j'ai récupéré une partie de ton code pour aller lire le texte d'un élément d'une barre de status (message SB_GETTEXT). Ca marche impeccablement sur une structure de classe msctls_statusbar32 (comme dans les programmes Wordpad ou Paint), mais le hic, c'est que j'ai voulu l'utiliser sur une status bar de classe "afx:400000.... quelquechose" et là, ça ne marche pas. Apparemment, je ne suis pas le seul à avoir eu ce problème (http://www.codeproject.com/Messages/3271576/How-to-read-text-from-a-status-bar-CStatus-of-anot.aspx), aurais-tu la réponse ?

Commentaire de Renfield le 03/08/2010 01:06:08 administrateur CS

dans quel soft puis-je trouver une telle status bar ?

Commentaire de Chouchensb le 03/08/2010 11:55:52

Merci Renfield,

Je ne m'attendais pas à une réponse aussi rapide !
Il s'agit en fait d'un vieux programme (d'il y a 10 ans je pense) qui controle un petit testeur numérique de labo. Et je cherche à automatiser une séquence de mesure en le pilotant via les API windows. Je ne sais pas où on peut trouver une classe similaire sur un autre soft, mais si j'ai aiguisé ta curiosité, je peux éventuellement te transmettre l'exécutable (il fonctionne en  mode démo quand il est tout seul). Mais je posais la question surtout pour savoir si le problème était connu (apparemment, pas si connu que ça) et quelle démarche adopter... La classe exacte retournée par winspector sur la barre de statut est "Afx:400000:0:10011:10:0" (la barre d'outil du soft, elle, est plus classique: ToolbarWindow32).

Commentaire de Renfield le 04/08/2010 09:27:59 administrateur CS



Pour la première zone de texte, tu peux faire :

If sClass = "Afx:400000:0:10013:10:0" Then
        nLength = SendMessage(vhWnd, WM_GETTEXTLENGTH, 0, ByVal 0&)
        sBuffer = Space$(nLength)
        nLength = SendMessage(vhWnd, WM_GETTEXT, nLength, ByVal sBuffer)
        vsResult = sBuffer
        ExtractWindowText = True
End If



je creuse pour les autres panels

Commentaire de Renfield le 04/08/2010 09:38:08 administrateur CS

regarde les jambes des deux 'p' du mot 'stopped'
elles sortent du cadre.

en gros, cela veux simplement dire que c'est dessiné par le programme, et donc pas simple a récupérer...

Commentaire de Chouchensb le 04/08/2010 10:27:57

Ah je me doutais qu'avec ma chance, j'allais tomber sur un truc du style :D
Bien vu pour les lettres p, j'avais pas vu. Merci beaucoup pour le coup de main néanmoins !

Simon

 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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 8,486 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales