IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Comment récupérer les éléments d'un autre programme ?


Sujet :

API, COM et SDKs Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 37
    Points : 30
    Points
    30
    Par défaut Comment récupérer les éléments d'un autre programme ?
    Bonjour,

    Est ce que qqu'un me m'aider sur un code afin de pouvoir récupérer
    les informations qui se trouve dans la fenettre d'un autre programme.
    A l'heure actuelle, j'ai seulement réussis a récupérer le texte se trouvant sur la fennettre principale du programme.

    je pense que je dois utiliser GetWIndowText Avec LB_Gettex pour récupérer les données de la liste mais je ne sait pas comment la manipuler qqu'un pêut m'aider ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    liste := FindWindowex(chat,0,'xxx',nil); 
    GetWindowText(hwnd(Liste),0,LB_GETTEXT);
    Et comment ajouter le résultat dans la liste de mon projet ? du style
    ListBox1.Items.Add(liste); dsolé je débute c'est vraiment pas évident
    malgrès que je cherche

    Merci * Henri

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Salut,
    je te repond pas parceke jai une iddee pour toi mais tout simplement c'est ke jai le même probleme je doit prendre des information d'une otre application et sa na pas marcher pour moi ?????
    Tu pourrai me dire comment ta fait
    Merci )

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var
    s:Array[0..255] of Char;
    SendMessage(handle, WM_GETTEXT,255,integer(@s));
    il te reste qu'a trouver le handle...

  4. #4
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    Bonjour nek_kro_kvlt,

    Le code ne fonctionne pas , pour récupérer les Items Du listBox de l'application externe, j'ai aussi regardé le tut de Nono40 en récupérant la partie qui l'as utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SendMessage(H, LB_GETTEXT,255,integer(@BuffTexte));
    mais mis a par comtpter le nombre d'items en retour j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    „Àu^[ð[Í@3À^
    et non pas le texte qui est afficher dans le LisBox de départ

    Merci
    Henri

  5. #5
    Membre actif
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Points : 245
    Points
    245
    Par défaut
    Si tu débute, c'est normal que tu t'en sorte pas forcement
    Pour recupéré les handles de chaque object, une fois que tu a identifier la fenètre, utilise EnumChildWindows. Maintenant, pour identifier de façon certaine un object, il te faudra dans un premier temp récupéré le coordonnée des composant que tu désir utiliser, si cest dernier sont statique grace a GetClientRect.
    Ensuite, une fois que tu aurtas cartographié la fenètre de cette façon, tu devrait pourvoir trouvé et utilisé les composant comme indiqué dans le post précedent

  6. #6
    Membre actif
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Points : 245
    Points
    245
    Par défaut
    Fait voir ton code stp

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    je ne mets pas tout le code car il est assez long pour acceder à tout les Handles , je mets seulement la par qui pose pb par contre les autre handles, sont des richedit et là j'arrive a recupérer tout les textes ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    procedure TForm1.Button1Click(Sender: TObject);
    var
    ListQuiBeug,R1,R2 : Thandle;
    BuffTexte: Array [0..255] of Char;
    Nombre,i : integer;
    begin
     R1:= FindWindow(........);
     R2:= FindWindow(........);
     RListQuiBeug:= FindWindow(........);
        If (R1 <> 0) and (R2 <> 0) And (RListQuiBeug<> 0) Then
          begin
            Nombre:=SendMessage(RListQuiBeug,LB_GETCOUNT,0,0);
             SendMessage(RListQuiBeug, LB_GETTEXT,255,integer(@BuffTexte));
            ListBox1.Items.Add(BuffTexte);
           edit2.Text := IntToStr(nombre);
          end
    ...
    Merci
    Henri

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2003
    Messages : 43
    Points : 57
    Points
    57
    Par défaut
    Salut,

    Si tu regardes la documentation du message LB_GETTEXT (http://msdn.microsoft.com/library/de...lb_gettext.asp)
    tu remarque que le troisième paramètre de SendMessage est l'index de la chaine à récupérer (mettre 0 pour le premier, 1 pour le deuxième, etc...).
    Dans ton code, tu essayes de récupérer le 256ième éléments. Je pense que tu as dû indiquer la longueur de ton tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
    ListQuiBeug,R1,R2 : Thandle;
    BuffTexte: Array [0..255] of Char;
    Nombre,i : integer;
    begin
     R1:= FindWindow(........);
     R2:= FindWindow(........);
     RListQuiBeug:= FindWindow(........);
        If (R1 <> 0) and (R2 <> 0) And (RListQuiBeug<> 0) Then
          begin
            Nombre:=SendMessage(RListQuiBeug,LB_GETCOUNT,0,0);
             SendMessage(RListQuiBeug, LB_GETTEXT, 0, integer(@BuffTexte)); // récupère le premier item
            ListBox1.Items.Add(BuffTexte);
           edit2.Text := IntToStr(nombre);
          end
    A toi donc de faire une boucle pour récupérer tous les éléments de la listbox!

    Bye

    Seb.

  9. #9
    Membre actif
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Points : 245
    Points
    245
    Par défaut
    +1

  10. #10
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    Je viens de faire le test en fesant en sorte que dans le ListBox que l'autre apllication il y est seulement 1 item et j'ai comme tu m'as dis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SendMessage(RListQuiBeug, LB_GETTEXT, 0, integer(@BuffTexte)); // récupère le premier item
    Voici le résultat qu'il me renvoie Xz¨Au



    j'ai vu que dans le tut de nono il utilisait ReadProcessMemory pour la liste des Items du status bar, peut on l'utiliser pour les items d'un listbox et surtout est utile dans mon cas ?

    Merci Henri

  11. #11
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2003
    Messages : 43
    Points : 57
    Points
    57
    Par défaut
    Et si tu testes ton code avec une listbox qui est dans ton application pour voir si celà ne viendrais pas du faite que tu essayes d'obtenir des informations d'une autre application.
    Je viens de tester avec une listbox appartenant à l'application et ton code marche parfaitement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    var
      Count, StrLength: Integer;
      Item: array[0..255] of Char;
    begin
     
      Count := SendMessage(ListBox1.Handle, LB_GETCOUNT, 0, 0);
      StrLength := SendMessage(ListBox1.Handle, LB_GETTEXT, 0, Integer(@Item));
     
    end;
    Je vais regarder du côté de ReadProcessMemory pour voir ce que ça donne.

  12. #12
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2003
    Messages : 43
    Points : 57
    Points
    57
    Par défaut
    J'ai regardé le code de nono et il utilise ReadProcessMemory juste pour le statusbar, pas pour la listbox (code juste au dessus) donc normalement, ça doit marcher !

    Peut être un problème de handle ?

  13. #13
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    En effet je viens de teste le code sur mon application ca marche ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender: TObject);
    var 
      Count, StrLength: Integer; 
      Item: array[0..255] of Char; 
    begin
      Count := SendMessage(ListBox1.Handle, LB_GETCOUNT, 0, 0);
      StrLength := SendMessage(ListBox1.Handle, LB_GETTEXT, 0, Integer(@Item));
      memo1.Text := 'Nombre de caractère = ' + inttostr(StrLength) + '  Et le mot correspond à :  ' + (item) + ' Nombre d''items =' + IntToStr(Count);;
    end;
    Mais pas sur l'application externe.

    En gros le projet que j'ai fais me sert a éviter d'utiliser aol ... voilà le résultat qui en sort :

    Résultat : sur l'apllication qui est AOL ...

    Nombre de caractère = 4
    Et le mot correspond à : ØÁvÈAu
    Nombre d'items =1 // seul ce résultat est valide

    Les proccessus son fait diferement apparament car meme pour recupérer le richedit only ... d'un salon j'ai du proceder diff

    mais pour le listbox celà fonctionne tjr pas

    Merci Henri

  14. #14
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2003
    Messages : 43
    Points : 57
    Points
    57
    Par défaut
    C'est peut être un problème d'encodage des caractères, peut être aol utilise t il l'unicode (c'est n'est qu'une suposition). La chaine que tu recherche fais bien 4 caractères ? Si oui, alors c'est le tableau qui pose problème, peut être qu'en essayant de le déclarer avec GlobalAlloc ça marcherais mieux, mais tout ceci reste une suposition !
    Peut être en déclarant le tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Item: array[0.255] of WideChar;

  15. #15
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    Non seul le nombre d'item est valable apprament j'accede pas au au contenu du listbox

    Déjà simplement pour récupérer le Richedit des salons j'ai du faire qqes modif que l'on avait dites . en utilisant PChar au lieu Array [0..255] of Char; et en ajoutant GetMem et FreMem car le retour du texte etait identique ca celà du LisBox actuellement, mais j'ai beau tout essayer, rien ne fonctionne

    Merci Henri

  16. #16
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2003
    Messages : 43
    Points : 57
    Points
    57
    Par défaut
    Tu peux toujours tenter ça, c'est peut être des grosses betises mais on ne sait jamais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    var
      Count, StrLength: Integer;
      Item: PChar;
    begin
     
      Count := SendMessage(ListBoxHandle, LB_GETCOUNT, 0, 0);
      Item := PChar(GlobalLock(GlobalAlloc(GMEM_MOVEABLE, 255)));
      StrLength := SendMessage(ListBoxHandle, LB_GETTEXT, 0, Integer(Item));
     
      GlobalUnlock(Cardinal(Item));
      GlobalFree(Cardinal(Item));

  17. #17
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    Toujour pareil c'est impressionant
    Je viens de refaire un projet simplement pour faire le test .... avec 3 editBox et un bouton afin de recupérer , le nombre d'item, la longeur et le nom correspondant à l'item mais seul le code Count est bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Count := SendMessage(Pseudos, LB_GETCOUNT, 0, 0); // Compte le nombre d'item
    Si certain sont sur aol 9 il peuvent regarder en fesant le test .

    Merci Henri

  18. #18
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    je viens de trouver ca .... mais c'est en vc++ .. je suis pas très doué mai sj'essais a comprendre
    apparament ca c'est pour le listBox ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    void ListerPseudos(void)
    {
    	HWND hListBox = ObjetSalon(4);
    	long mThread, itmHold, psnHold;
    	unsigned long cProcess,sThread, rBytes;
    	int nbPseudo;
    	BYTE Pseudo[16] = "";
    	int comptA = 0;
    	sThread = GetWindowThreadProcessId(hListBox, &cProcess);
    	mThread = (long)OpenProcess(PROCESS_ALL_ACCESS, true, cProcess);
    	nbPseudo = SendMessage(hListBox,LB_GETCOUNT, 0, 0) - 1;
    	while(1 == 1)
    	{
    		itmHold = SendMessage(hListBox, LB_GETITEMDATA, comptA++, 0);
    		if(itmHold == -1) return;
    		itmHold += 28;
    		ReadProcessMemory((LPVOID)mThread, (LPCVOID)itmHold, Pseudo, 4, &rBytes);
    		CopyMemory(&psnHold, Pseudo, 4);
    		psnHold +=6;
    		ReadProcessMemory((LPVOID)mThread, (LPCVOID)psnHold, Pseudo, 25, & rBytes);
    		SendMessage(hListb1, LB_ADDSTRING, 0, (long)Pseudo);
    	}
     
    	return;
    }

  19. #19
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2003
    Messages : 43
    Points : 57
    Points
    57
    Par défaut
    En delphi ça donne ça (je sais pas si ça t'aidera !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    procedure ListerPseudos();
    var
       mThread, itmHold, psnHold: Integer;
       cProcess, sThread, rBytes: Cardinal;
       nbPseudo, comptA: Integer;
       Pseudo: array[0..15] of Char;
    begin
     
       comptA := 0;
       ZeroMemory(@Pseudo, SizeOf(Pseudo));
       sThread := GetWindowThreadProcessId(HandleListAOL, cProcess);
       mThread := OpenProcess(PROCESS_ALL_ACCESS, true, cProcess);
       nbPseudo := SendMessage(HandleListAOL, LB_GETCOUNT, 0, 0) - 1;
       while(true) do
       begin
          itmHold := SendMessage(HandleListAOL, LB_GETITEMDATA, comptA, 0);
          Inc(comptA);
          if (itmHold = -1) then
                Break;
          itmHold := itmHold + 28;
          ReadProcessMemory(mThread, Pointer(itmHold), @Pseudo, 4, rBytes);
          CopyMemory(@psnHold, @Pseudo, 4);
          psnHold := psnHold + 6;
          ReadProcessMemory(mThread, Pointer(psnHold), @Pseudo, 25,  rBytes);
          SendMessage(HandleList2, LB_ADDSTRING, 0, Integer(@Pseudo));
       end;
     
       Exit;
    end;

  20. #20
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    Whouaou Je te remercie beaucoups blinkseb je teste de suite

    Merci henri

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [JXTA] Comment récupérer les pipe advertisments des autres peers
    Par adel_adl dans le forum Général Java
    Réponses: 2
    Dernier message: 08/06/2010, 15h12
  2. RCP récupérer les éléments d'une autre vue
    Par kespy13 dans le forum Eclipse Platform
    Réponses: 3
    Dernier message: 07/05/2009, 15h00
  3. Réponses: 1
    Dernier message: 11/09/2006, 11h21
  4. Comment récupèrer les éléments d'une JList
    Par Orian dans le forum Composants
    Réponses: 13
    Dernier message: 10/09/2006, 11h53
  5. Comment récupérer les éléments d'un getComments
    Par AlexandraS dans le forum Langage
    Réponses: 6
    Dernier message: 31/05/2006, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo