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 :

Accéder aux champs d'une fenêtre d'un autre logiciel


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 36
    Points : 41
    Points
    41
    Par défaut Accéder aux champs d'une fenêtre d'un autre logiciel
    Bonjour,

    je dispose d'un vieux logiciel, sans les sources, dans lequel j'aimerais récupérer des données qui se trouvent dans des champs d'éditions classiques tels que des TEdit.

    Est-il possible de réaliser avec Delphi un outil qui me permette de récupérer ces données directement dans les champs d'édition de ce vieux logiciel ?

    Je suppose qu'il faut fouiller du côté de l'Api Windows et des Handle de fenêtres. Peut-être y a t'il une autre piste. Votre avis m'intéresse.
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    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 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    regarde du cote des defis delphi
    il y a des sources pour jouer au demineur la plupart des defieur on a utilisé les api afin de connaitre les couleur de la case le principe est le meme pour recuperer un text a l'exception pres que tu doit utiliser gettext si mes souvenir sont correct

    @+ Phil

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 36
    Points : 41
    Points
    41
    Par défaut
    Parfait. Merci pour cette piste. Je vais creuser.

  4. #4
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    748
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 748
    Points : 500
    Points
    500
    Par défaut
    salut , regarde dans la fac .. "Piloter une application tierce", c'est que tu cherches.

    bye

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Voici les fct que j'utilise dans une appli que j'ai écrite pour les mêmes besoins.
    Elles sont à la base inspirées des conseils/exemples des membres du forum ou encore de la faq.

    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
    Function RecuperTexteSousLasouris():string;
    var titre : String;
      Handle: THandle;
      L:cardinal;
      C:PChar;
      Posi:Tpoint;
      txt:string;
    begin
      getcursorpos(posi);
      Handle:=WindowFromPoint(posi);
     // Récupération du texte contenu dans la fenêtre survolée
       L := SendMessage(Handle,WM_GETTEXTLENGTH,0,0);//la longueur du texte
      If L<>0 Then begin
        GetMem(C,L+1); //on alloue la mémoire.  // L+1 parce que les chaînes sont à zéro terminal, il faut prévoir la place du #0
        Try
          SendMessage(Handle,WM_GETTEXT,L+1,Integer(C));//on recupère le texte
          txt:=c;
        Finally
          FreeMem(c);
        End;
      End
      Else txt:='';
      result:=uppercase(txt);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function RecuperTexteALaPositionXY(x:word;y:word):string;
    //Attention : les coordonnees X et y sont relatives au coin TOPLEFT
    // de la fenetre au premier plan
    var titre : String;
      HandlFenetre: THandle;
      RectWin:Trect;
    begin
      HandlFenetre:=GetForegroundWindow;
      GetWindowRect(HandlFenetre,RectWin);
      SetLength(titre, 255);
      GetWindowText(WindowFromPoint(point(RectWin.Left+x,RectWin.top+y)), PChar(titre), 255);
      result:=uppercase(titre);
    end;
    selon le type de champ dont on veut récupérer le contenu, ça ne marche pas toujours.

    Dans ce cas je positionne la souris sur le champ, simule un double clic, simule un copier (ctrl+c) et en fin récupère le contenu du clibboard avec la procedure suivante :
    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
    function RecupereLeTexteDuClipBoard:String;
    var MyClip:TClipBoard;
        success:boolean;
        NbrEssais:word;
        MaxEssais:word;
    begin
    // Initialisations -------------------------------------------------------------
      MaxEssais:=20;
      success:=false;
      NbrEssais:=0;
      //boucle
      repeat
     
        try begin
          Application.ProcessMessages;
          MyClip:=TClipBoard.Create;
          MyClip.Open;
          if MyClip.HasFormat(CF_TEXT) then result:=MyClip.AsText;
          MyClip.Close;
          MyClip.free;
          success:=true;
          inc(NbrEssais);
        end
        except
          result:='';
          success:=false;
          Attente(50);
        end;
      until (success=true) or (NbrEssais>MaxEssais);
     
      //rapport
      if (NbrEssais<=MaxEssais) and (NbrEssais>1) then
        Journal('Lecture.Clip OK    ' + '[' + inttostr(NbrEssais) + '] ',true);
      if (NbrEssais>MaxEssais) then
        Journal('Lecture.Clip ECHEC ' + '[' + inttostr(NbrEssais) + '] ',true);
     
    end;
    ensuite y'a plus qu'a simuler un appui sur tab pour passer au champ suivant et recommencer...

    a+

    David

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 36
    Points : 41
    Points
    41
    Par défaut
    Formidable ! Merci à tous.
    Mes premiers tests sont concluants.
    Je vais fignoler tout cela.

    Encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Accéder aux champs et méthodes d'une classe englobante
    Par collect dans le forum Général Java
    Réponses: 14
    Dernier message: 25/06/2013, 23h50
  2. Réponses: 2
    Dernier message: 20/05/2011, 16h29
  3. Accéder aux champs d'une ListControl
    Par Khaoula.85 dans le forum MFC
    Réponses: 0
    Dernier message: 07/12/2009, 17h45
  4. Accéder aux champs d'un objet à l'aide d'une liste
    Par lia dans le forum Général Python
    Réponses: 2
    Dernier message: 19/01/2009, 15h12
  5. accéder aux champs contenus dans une iFrame
    Par toome dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/01/2008, 19h45

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