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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    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 490
    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 490
    Par défaut
    salut

    recherche dans les message wm_gettext et send message

    @+ Phil

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    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 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    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 éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    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 490
    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 490
    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

  8. #8
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    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 : 124
Taille : 125,5 Ko

  10. #10
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    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 490
    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 490
    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

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    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

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