begin process at 2008 05 16 09:08:30
1 173 235 membres
76 nouveaux aujourd'hui
13 970 membres club

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 : 22/04/2008 16:16:50 Vu / téléchargé: 3 080 / 315

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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


Description

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
ComboBox
TextBox
ListView
TreeView
...
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

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
  • 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 !

Ajouter un commentaire

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS