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 :

Récupérer le texte dans un static en API


Sujet :

API, COM et SDKs Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Récupérer le texte dans un static en API
    Bonjour,

    je me prends la tete depuis quelques temps pour recupérer le texte dans un static à partir d'une autre application, en fait je voudrais recupérer le N° de la plaque d'immatriculation qui change constament ( voir image en bas ).Et l'afficher par exemple dans un edit d'une form sous delphi.



    Je vous donne le lien pour telecharger le prog :

    http://www.licenseplaterecognition.com/Demo/CarUSA.zip


    j'ai essayé pas mal de truc en cmd API mais bon je la bloque ..!

    SVP une solution ??

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    recherche dans les message wm_gettext et send message

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    J'ai une bien mauvaise nouvelle Je m'embêtait ce soir.. alors je me suis dit .. tiens je vais faire ca. Donc j'ai créé un petit soft qui lance ton programme, qui recupère le handle de la fenetre, qui cherche le static contenant le N° et qui le transmet à une edit de ma Form. Ca c'est la théorie.

    Dans la pratique : deja je me dit : Ohhh la classe de la fenetre est bizzare... je vais prendre son handle en fonction du nom de classe. ET BEN NON. Le nom de la classe de la Fenetre change a chaque lancement.

    Ensuite il a fallu retrouver parmis tous les enfants, le bon static. il faut prendre 4 fois l'enfant puis 10 fois le composant suivant pour arriver sur le bon static. Ils on un peu essayé de le cacher il me semble.

    Finalement j'avais le handle du bon "Static" et ben tu sais quoi ? Il ont du faire quelquechose pour le protéger. la fonction GetWindowText ne marche pas et la manière postMessage(handle, WM_GETTEXT .... ) ne marche pas non plus. je te met quand m'eme mon petit code mais je vois pas comment faire d'autre.

    pour le lancer il faut que l'exe delphi soit au meme endroit que celui du programme.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ShellAPI, StdCtrls, ExtCtrls, Contnrs;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        Timer1: TTimer;
        procedure Timer1Timer(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      hand : HWND;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
      var i : Integer;
    begin
     
      ShellExecute(Form1.Handle, 'open', 'Player.exe', nil, nil, SW_SHOW);
      Sleep(1000); //Obligé.. sinon le getForgroundWindow attrape le handle de Form1
      hand := GetForegroundWindow();
     
      for i := 1 to 4 do
        hand := GetWindow(hand, GW_CHILD);
      for i := 1 to 10 do
        hand := GetWindow(hand, GW_HWNDNEXT);
     
      Button1.Enabled := false;
      Timer1.Enabled := true;
     
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
      var Buffer : String;
          mem    : Integer;
    begin
      Mem:=SendMessage(hand,WM_GETTEXTLENGTH,0,0)+1;
      SetLength(Buffer, mem);
      PostMessage(hand,WM_GETTEXT,Mem,Integer(@Buffer[1]));
      Edit1.Text := Buffer;
    end;
     
    end.
    Au final je sens que tu va quand même devoir acheter le programme ^^

    Cordialement

    Hy00ga

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 325
    Points
    11 325
    Billets dans le blog
    6
    Par défaut
    effectivement, TStaticText ne descend pas de TEdit, donc pas de GetText...
    à noter dans Lazarus, la définition d'une méthode virtuelle GetLabelText pour le StaticText !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    Le label contenant le n° de plaque n'est pas un TStaticText. En fait l'appli n'a même pas été faite en Delphi. C'est un objet de la classe "Static", de C++ ou un autre language.
    Et l'objet en question n'a pas besoin d'etre un descendant de TEdit pour qu'on puisse utiliser le PostMessage(handle, WM_GETTEXT ....) car cela fonctionne aussi sur une fenêtre principale.
    Et via GetWindowText cela ne fonctionne pas non plus. Ce qui me fait penser que, soit, ils ont fait exprès de le protéger, Soit dans leurs static ils n'affichent pas en tant que texte mais en tant qu'image ce qui expliquerai l'impossibilité d'en récupérer la valeur... A moins que vous ne trouviez une autre méthode

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci des tentatives et à Hy00ga pour son petit code qui vas certainement me servir, si toutefois j'arrive a trouver cette satanée methode ..

    et je ne vois pas comment utiliser le GetLabelText dans delphi ...

    je ne sais plus trop de quel endroit partir là !!

    Une autre idée ?.?

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut


    bon c'est quoi cette histoire de decendant de tedit cela n'a rien a voir
    le wm_gettext est un message windows qui permet de recuperer tout texte affiché

    voici un code exemple fonctionnant avec le statictext ou static
    car si vous regarder les sources de la vcl il recreer une class static(windows)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Chain : PChar;
      Hwd, LenStr : integer;
    begin
       Hwd := StaticText1.Handle;
       LenStr:=SendMessage(Hwd,WM_GetTextLength,0,0);
       if LenStr>0 then
        begin
           SendMessage(Hwd,WM_GetText,LenStr+1,integer(Chain));
           edit3.Text := Chain;
        end;
    end;

    @+ Phil

    PS : je viens de faire un tour dans la faq et voila pas ce que je trouve

    textesouscurseur
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    Citation Envoyé par hy00ga
    Et l'objet en question n'a pas besoin d'etre un descendant de TEdit pour qu'on puisse utiliser le PostMessage(handle, WM_GETTEXT ....) car cela fonctionne aussi sur une fenêtre principale.
    C'est exactement ce que je disait Sauf que dans notre cas précis, avec ton même exemple, si tu passe la souris sur le "static" contenant le N° de plaque.... suspens.... RIEN J'ai eu beau passer pas mal de temps en essayant plusieurs méthodes, pas moyen de récupérer le text de ce composant

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    En fait j'ai espionné tout ce qui se passait dans le static, mais je ne vois aucun texte correspondant au N° de la plaque, bien que dans le prog il y est la possibilité de changer les font et la police d'ecriture , on la retrouve bien avec WM_GETFONT, mais ca reste un mystere ....

    Sinon a quoi corresponderai le WM_PAINT ?

    Nom : 1.jpg
Affichages : 115
Taille : 125,5 Ko

  10. #10
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    Une demande de redessinage du composant. ... normalement le WM_PAIN a être appelé a chaque fois que le numéro de plaque va changer.

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut


    si c'est une image tu devrais pouvoir utiliser
    l'instruction EnumEnhMetafile

    la fonction permetant d'extraire les caractere
    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
     
    Function TransformPointerToStr(MetaRec: Pointer) : string;
    Type
       Barptr = array of char;
    var
       i : integer;
       Ofs: integer;
      Len: integer;
     
    begin
      Result := '';
      if tagENHMETARECORD(MetaRec^).iType in [EMR_EXTTEXTOUTW,EMR_EXTTEXTOUTA] then
      begin
        Ofs := tagEMREXTTEXTOUTA(Metarec^).EMRText.offString;
        Len := tagEMREXTTEXTOUTA(Metarec^).EMRText.nChars;
        SetLength(Result, Len);
        for i := 0 to len-1 do
          Result[I+1] := Barptr(MetaRec)[ofs+(i*2)];
      end;
    end;
    la fonction callback d'extraction devrais etre de ce type la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function MetaEnum(DC: THandle; HandleTable: pointer; MetaRec: Pointer; Count: word; List: pointer): shortint stdcall;
    var
      Aenr : String;
    begin
      Aenr := TransformPointerToStr(MetaRec);
      Result := 1;
     
      if trim(Astr)='' then
        exit;
     
       TstringList(List).Add(aStr);
     
    end;
    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Bonjour,
    je suis aussi intéressé par une méthode pour récupérer le texte d'un static particulier (particulier car il ne répond pas au WM_GETTEXT).

    Je n'ai pas réussi/compris la solution de anapurna: qu'est ce que je dois mettre en paramètre de EnumEnhMetafile en sachant que je n'ai que le handle de mon static control.

    Merci à tous,
    David

    PS: L'application dans laquelle je veux récupérer le texte du static a été écrite en WinDev.

  13. #13
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    bon moi ça me parait douteux d'aider quelqu'un à lire les plaques d'immatriculation

    donc à vu de nez, et vu les difficultés rencontrées par ceux qui ont essayé, je pense que le texte est directement dessiner sur un DC (comme Canvas.TextOut) et que donc on ne peut pas le récupérer
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  14. #14
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    a mon avis notre ami veut créer un peut mieux qu'un OCR du marcher.

  15. #15
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    il faut utiliser une api windows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var
      ARect : Trect;
    begin
        EnumEnhMetafile(0,Img.Handle, @MetaEnum,Lst, ARect);
        if lst.count > 0 Then
        begin
         // j'ai recuperer des elements
          traitement(lst);
        end;
    end;
    mais pour que cela fonctionne il te faut creer une image (metafile)
    sinon cela ne sert a rien

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Bonjour et merci pour votre réactivité.

    Me concernant, j'ai besoin de cette astuce pour lire la valeur écrite dans un static d'une appli écrite en WinDev qui mesure une activité nucléaire (attention, ca fait peur ). Je vous rassure, c'est pour du médical (Médecine Nucléaire) .

    Bref,
    anapurna je ne comprends pas déjà la méthode:
    Est ce que le but est de faire une impression de l'écran de l'appli pour créer une image sur laquelle travailler ou est ce qu'on peut attaquer directement l'appli en décomposant un metafile pour extraire les TextOut qui le compose ?

    Dans ton exemple, Img contient l'image à traiter en entrée ? Comment récupérer l'image dans le bon format (format qui doit contenir des records définissant le contenu de l'image) ?

    Merci anapurna.
    A+

  17. #17
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    mon exemple ne traite que des metafile
    c'est un exemple que j'ai donnée car apriorie le fameux static
    n'été pas identifiable par un handle windows

    j'ai pensé qu'il s'agisé peut etre d'une image

    je me sert de cette technique pour rechercher des elements dans un metafile

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    OK,
    est ce qu'on peut identifier du texte dans une image basique (bmp) ou faut t'il un metafile obligatoirement ?

    S'il faut un metafile, est ce qu'il est possible de l'extraire d'une fenêtre ?

    Merci

  19. #19
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    ma technique n'est valide que pour les metafile
    car il gere le text (c'est une sorte de vectoriel)
    donc in sait les composante de son dessin
    pour le bitmap il faut faire une sorte d'ocr ( reconnaissance de caractere)

    en recherchant les vecteur composite du dessin tu devrais pouvoir retrouver les caractere si ceux-ci sont dactilographié

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  20. #20
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 487
    Points : 24 963
    Points
    24 963
    Par défaut
    bon désolé de coller du code que j'ai fait dans mes débuts dans un exemple de phidels, mais si tu arrives à t'en inspirer, tu devrais pouvoir une vue des controls de ton application (voir image qui montre pour Explorer)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GenererArbre(HandleFormWindev);
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    procedure TFrm_Tueur_de_processus.GenererArbre(HandleArbre: THandle);
     
      function GetClassAndCaption(aHandle: THandle): string;
      var
        lpRes : array[0..256] of Char;
        StrClass: string;
        StrCaption: string;
      begin
          GetClassName(aHandle, lpRes, SizeOf(lpRes));
          StrClass := lpRes;
          GetWindowText(aHandle, lpRes, SizeOf(lpRes));
          StrCaption := lpRes;
          Result := Format('%s : "%s" (%d)', [StrClass, StrCaption, aHandle])
      end;
     
      function GetWindowList(HandleStart: THandle; RelationStart: Cardinal; RelationDirection: Cardinal = GW_HWNDNEXT): TStringList;
      var
        HandleFound: THandle;
      begin
         Result := TStringList.Create();
     
         HandleFound := GetWindow(HandleStart, RelationStart);
         repeat
             if (HandleFound <> 0) and (HandleFound <> HandleStart) then
             begin
                Result.AddObject(GetClassAndCaption(HandleFound), Pointer(HandleFound));
             end;
             HandleFound := GetWindow(HandleFound, RelationDirection);
          until (HandleFound = 0);
      end;
     
      function GetFreres(HandleFrere: THandle): TStringList;
      begin
         Result := GetWindowList(HandleFrere, GW_HWNDFIRST);
      end;
     
      function GetEnfants(HandleParent: THandle): TStringList;
      begin
         Result := GetWindowList(HandleParent, GW_CHILD);
      end;
     
      function GetParents(HandleEnfant: THandle): TStringList;
      begin
         Result := GetWindowList(HandleEnfant, GW_OWNER, GW_OWNER);
      end;
     
      procedure ArbreEnfant(Tree: TTreeNodes; Node: TTreeNode; HandleParent: THandle);
      var
         EnfantsList: TStringList;
         IndexEnfant: Integer;
         NewNode: TTreeNode;
      begin
         EnfantsList := GetEnfants(HandleParent);
         try
            EnfantsList.Sort();
            for IndexEnfant := 0 to EnfantsList.Count-1 do
            begin
               NewNode := Tree.AddChildObject(Node, EnfantsList.Strings[IndexEnfant], EnfantsList.Objects[IndexEnfant]);
               ArbreEnfant(Tree, NewNode, THandle(EnfantsList.Objects[IndexEnfant]));
            end;
         finally
           EnfantsList.Free();
         end;
      end;
     
      function SameParent(ParentHandle, HandleFrere: THandle): Boolean;
      var
         ParentList: TStringList;
      begin
         Result := False;
     
         ParentList := GetParents(HandleFrere);
         try
            if ParentList.Count > 0 then
               Result := THandle(ParentList.Objects[ParentList.Count-1]) = ParentHandle;
         finally
           ParentList.Free();
         end;
     
      end;
     
    var
      ParentList, FreresList: TStringList;
      IndexParent, IndexFrere: Integer;
      ItemSelectNode, ParentNode, FrereNode, VoisinNode, Node: TTreeNode;
      HandleTopParent: THandle;
    begin
      HandleTopParent := 0;
     
      TreeView3.Items.BeginUpdate();
      try
         TreeView3.Items.Clear();
     
         ItemSelectNode := TreeView3.Items.Add(nil, 'Element Sélectionné');
         Node := TreeView3.Items.AddChildObject(ItemSelectNode, GetClassAndCaption(HandleArbre), Pointer(HandleArbre));
         ArbreEnfant(TreeView3.Items, Node, HandleArbre);
     
         ParentNode := TreeView3.Items.Add(ItemSelectNode, 'Parent');
         ParentList := GetParents(HandleArbre);
         Node := ParentNode;
         try
            if ParentList.Count > 0 then
               HandleTopParent := THandle(ParentList.Objects[ParentList.Count-1]);
     
            for IndexParent := ParentList.Count-1 downto 0 do
            begin
                Node := TreeView3.Items.AddChildObject(Node, ParentList.Strings[IndexParent], ParentList.Objects[IndexParent]);
            end;
         finally
           ParentList.Free();
         end;
     
         FrereNode := TreeView3.Items.Add(ItemSelectNode, 'Frères');
         VoisinNode := TreeView3.Items.Add(FrereNode, 'Voisins');
         FreresList := GetFreres(HandleArbre);
         FreresList.Sort();
         try
            for IndexFrere := 0 to FreresList.Count-1 do
            begin
                if SameParent(HandleTopParent, Integer(FreresList.Objects[IndexFrere])) then
                   Node := FrereNode
                else
                   Node := VoisinNode;
     
                Node := TreeView3.Items.AddChildObject(Node, FreresList.Strings[IndexFrere], FreresList.Objects[IndexFrere]);
     
                ArbreEnfant(TreeView3.Items, Node, THandle(FreresList.Objects[IndexFrere]));
            end;
         finally
           FreresList.Free();
         end;
      finally
         TreeView3.Items.EndUpdate();
      end;
     
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. [Lazarus] Comment récupérer un texte dans un Tedit ?
    Par Ben8282 dans le forum Lazarus
    Réponses: 10
    Dernier message: 29/01/2008, 21h53
  2. Récupérer le texte dans un static en API
    Par logicom dans le forum Delphi
    Réponses: 6
    Dernier message: 19/02/2007, 10h51
  3. Récupérer du texte dans une page HTML
    Par iks22 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 31/12/2006, 09h10
  4. Réponses: 14
    Dernier message: 19/05/2006, 13h26
  5. [Excel] Récupérer le texte dans un shape de type zonedetext
    Par Rakham dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/12/2005, 11h00

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