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

Delphi Discussion :

Get text from application window or other


Sujet :

Delphi

  1. #1
    Membre habitué Avatar de Ludo_360
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    295
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 295
    Points : 191
    Points
    191
    Par défaut Get text from application window or other
    Salut,

    J'ai besoin de récupérer du texte d'une application quelconque ( firefox, notepad...). Je peux récupérer le handle de la fenetre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     handl:= Getforegroundwindow();
    mais ça ne m'aide pas tellement...

    A l'origine je récupèrais un handle grâce à la position du curseur de la souris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Handl:= WindowFromPoint(Mouse.CursorPos)
    Le handle est recherché grâce à un timer, puis mémorisé au clic de la souris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     BGSouris:= getAsyncKeyState(VK_LButton)<0;
    if (BGSouris) then // memorise le handle
    Ceci fonctionnait bien mais mon but est d'optimiser mon application ( pour une question pratique): cad de récupérer un handle qui correspond à la zone texte où le curseur est actif ( donc sans le clic de la souris).

    J'ai essayé avec diverses fonctions mais je n'arrive pas à comprendre pourquoi on peut récupérer le handle correcte grâce à la souris et avoir autant de difficulté pour trouver la fonction qui me donnerait le même handle en recherchant la position du curseur actif.

    J'ai tenté de trouver le control actif grâce à la fonction mais pas moyen de retrouver un handle ou même juste une position en X et Y( dans ce cas il me suffirait de rechercher le handl grâce à la position.

    Enfin voila, cela fait plusieurs fois que je sollicite de l'aide mais je pense que je ne formulais pas assez explicitement mon problème.

    merci pour l'aide

    ludo

  2. #2
    Membre habitué Avatar de Ludo_360
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    295
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 295
    Points : 191
    Points
    191
    Par défaut
    Je retrouve le même handle:

    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
     
       MousePos : Tpoint;
       handl : HWND;
       control : TControl;
     
     
    begin
    // le but ici est de récupérer le handle du control ou le curseur est actif
       handl:= Getforegroundwindow();
       control:= ActiveControl;
       mousePos.X := Control.Left + Control.Width div 2;
       mousePos.Y := Control.Top + Control.Height div 2;
       MousePos := ClientToScreen(mousePos) ;
       handl:= WindowFromPoint(MousePos);
       edt_buf.Text:= 'Pos X : ' + inttostr(mousePos.X)+ '    Pos Y : ' + inttostr(mousePos.Y);
       edt_affich.text:= 'Handle_Courant = ' + inttostr(handl);
       if ((Handl) <> (Form_Clavier.Handle)) and (((MousePos.X < 0 ) or (MousePos.X > form_clavier.Width)) or ((MousePos.Y < 0) or (MousePos.Y > form_clavier.Height - 50))) then begin
          Handle_Cible:= Handl;
          edit_test.Text:= 'Handle_Cible = ' + inttostr(Handle_Cible);
       end;
    merci quand même

    ludo

  3. #3
    Membre habitué Avatar de Ludo_360
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    295
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 295
    Points : 191
    Points
    191
    Par défaut Ne marche pas en dehors de l'application
    Activecontrol me renvoi le control actif mais seulement dans mon application.

    La fonction GetCaptureControl parait plus appropriée, mais lorsque j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    control:= getcapturecontrol();
       mousePos.X := Control.Left + Control.Width div 2; // erreur sur cette ligne
    au lancement de l'application un message d'erreur stipule qu'il y a une violation d'accès.

    de l'aide svp

  4. #4
    Membre habitué Avatar de Ludo_360
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    295
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 295
    Points : 191
    Points
    191
    Par défaut Ca marche nickel...
    Je donne le source pour ceux que ça interesse:

    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
     
     
    (*******************************************************************************
    ***                                                                          ***
    ***                                 timer                                    ***
    ***                                                                          ***
    *******************************************************************************)
     
     
    function TMon_appli.GetCaretPosition(var APoint: TPoint): Boolean;
    var handl: HWND;
      aID, mID: DWORD;
    begin
      Result:= False;
      handl:= GetForegroundWindow;       // handle de la fenetre
      if handl <> 0 then
      begin
        aID:= GetWindowThreadProcessId(handl, nil);      // L'ID de cette application
        edt_clipbrd.Text:= inttostr(aID);
        mID:= GetCurrentThreadid;                        // L'ID de notre application clavier
        edt_clipbrd.Text:= edt_clipbrd.Text + '    ' +inttostr(mID);
        if aID <> mID then                               // si il y a deux applis
        begin
          if AttachThreadInput(mID, aID, True) then      // si on peut relier les deux appli (inputs)
          begin
            handl:= GetFocus;                            // récupère le focus
            if handl <> 0 then
            begin
              Result:= GetCaretPos(APoint);              // récupère la position du curseur actif
              Windows.ClientToScreen(handl, APoint);     // on se référencie par rapport a l'écran
            end;
            AttachThreadInput(mID, aID, False);          // on libère la liaison entre les deux applis
          end;
        end;
      end;
    end;
     
    (******************************************************************************)
    procedure TMon_appli.Timer1Timer(Sender: TObject);
    var
       CaretPos : Tpoint;
       handl : HWND;
    begin
    //   BGSouris:= getAsyncKeyState(VK_LButton)<0;       // Ne sert à rien, diminue l'accessiblité
    // le but ici est de récupérer le handle du control ou le curseur est actif
       if not GetCaretPosition(CaretPos) then begin
          edt_buf.Text:= ('erreur: impossible de trouver la fenetre');
         // handle_Cible:= GetDesktopWindow();
          edit_test.Text:= 'Handle_Cible = ' + inttostr(Handle_Cible);
       end else begin
          handl:= WindowFromPoint(CaretPos);
          CaretPos:= ScreenToClient(CaretPos);
          edt_buf.Text:= 'Pos X : ' + inttostr(CaretPos.X)+ '    Pos Y : ' + inttostr(CaretPos.Y);
          edt_affich.text:= 'Handle_Courant = ' + inttostr(handl);
          if (handl <>Mon_appli.handle) and (handl <> Handle_Cible) then begin
             Handle_Cible:= Handl;
             edit_test.Text:= ' Handle_Cible = ' + inttostr(Handle_Cible);
          end;
       end;
    end;
    voila a++

    ludo

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 02/12/2011, 10h49
  2. Fermer une application Windows
    Par telecnop dans le forum Langage
    Réponses: 20
    Dernier message: 28/06/2006, 21h15
  3. [C#] [VS.NET] Réutiliser une Form d'une application windows?
    Par yannick_sch dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/10/2004, 14h28
  4. Focus sur une application Windows
    Par mixi dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/10/2004, 19h57
  5. comment ecrire du texte dans une window application
    Par gaut dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 16/07/2003, 10h23

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