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

Langage Delphi Discussion :

Handle d'une application précise


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 45
    Points : 25
    Points
    25
    Par défaut Handle d'une application précise
    Bonsoir,

    Je donne du texte à une application externe, puis je simule le clic.
    Le tous en recuperant les handle via un prog WindowsSpy.
    Cependant, je suis à chaque fois obliger de recuperer ces handle à chaque fois que je le lance pour inserer le texte puis simuler l'appui, car les numero de handle change.
    La question est :
    Comment puis-je recuperer les handle automatiquement pour une application bien precise sachant que:
    Les ATL (classes) se trouve dans une fenêtre (sûrement les enfants).

    je ne sais pas si c'est clair pour vous ?

    Merci beaucoup pour l'aide qui je suis sûr me seras d'une grande utilité.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    Le Handle d'une fenêtre est retourné par la fonction FindWindow. Si la fenêtre est une fenêtre fille, tu récupères le handle de la fenêtre principale avec FindWindow puis la fenêtre fille avec GetWindow.
    Je te donne un exemple avec NotePad. La fonction retourne le handle de la fenêtre Edit de NotePad qui est une fenêtre fille de l'application :

    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 TForm1.GetNotePadHandle : THandle;
      var
      aHandle :THandle;
      P : Array[0..256] of Char;
     
      Const
      BlocNote = 'Sans titre - Bloc-notes';   // Titre de la fenêtre NotePad
      EditClass = 'Edit';                     // Classe de la fenêtre edit de NotePad
    begin
      // Recherche de la fenêtre BlocNote
      aHandle := FindWindow(0,Pchar(BlocNote));
      if aHandle > 0 then
      begin
         // Recherche de la fenêtre Edit de NotePad (Fenêtre enfant):
         aHandle := GetWindow(aHandle,GW_CHILD);
         Repeat
           GetClassName(aHandle,P, Sizeof(P));
           if String(P) <> EditClass then
             aHandle := GetWindow(aHandle, GW_HWNDNEXT);
         Until  String(P) = EditClass;
      end;
      Result := aHandle;
    end;
    En espérant que ça réponde à ta question.
    EB

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Bonjour ebastien

    FindWindow permet de retrouver le Handle par le nom de la fenêtre.
    Cependant, le nom de ma fenêtre change toujours, donc je pense que je ne peut pas utiliser FindWindow. (à mon avis)

    En ce qu'il concerne la classe, ce sont des ATL.

    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
    -001703F6 - _Depannage_Informatique_: Video Chat Room
        00070394 -  (WTL_MultiPaneStatusBar)
         -0007037C -  (ATL:0088DE00)
          -001403C6 -  (ATL:0088DE00)
            00090358 -  (ATL:0088DB30)
            001003C8 -  (ATL:0088DBC0)
          00090388 -  (ATL:0088D2C0)  
          0009036E -  (ATL:0088D2C0)
          000903B4 -  (ATL:0088D2C0)
          0008036C -  (ATL:0088DA10)
          00060412 -  (ATL:0088D2C0)
          000C0450 -  (ATL:0088D2C0)
          00070400 -  (ATL:0088D2C0)
          00070414 -  (ATL:0088DAA0)  Besoin de ce handle ci
          0005048E -  (ATL:0088D2C0)  Besoin de ce handle ci
    J'ai besoin uniquement de récuperer les 2 numero handle du bas automatiquement pour ensuite leurs envoyer un message via SendMessage(), et je pense que je peut le recuperer que par la classe, mais le problème; ce sont des ATL .

    Je sais c'est flou, j'ai déjà beaucoup de peine à comprendre moi même, donc tres compliquer à expliquer.
    C'est juste une question d'automatisation.
    Merci pour vos renseignement...

    Ps:réediter :

    En faite, je souhaite agir sur les objets (boutons ...etc) à l'interieur même de l'appli externe.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Bonsoir,

    Comme je pense que tous ceci est flou, je vais decomposer le problème en plusieurs partie, ce seras beaucoup mieux.

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monhandle := FindWindow(nil, ma_fenetre);
    -FinWindow va bien retourner le numero de handle pour ma_fenetre.
    Ok, mais le problème est que le titre de ma barre de dialogue change de nom souvent, donc, je ne peut pas de cette façon.

    Je peut recuperer aussi un handle via le Classe Name :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monhandle := FindWindow('#32770', nil)
    Ok, mais le problème est que la classe est #32770 et que cette classe me renvoie le handle de Nero, donc, ce n'est pas une solution non plus.

    Donc, premiere question, comment puis-je recuperer le handle de cette fenêtre?
    Deuxieme question et suggestion, le nom de la barre de dialogue est jamais identique, cepandant ,les derniers mot, eux le sont.
    Donc, ne peut-ont pas identifier le handle via le classe name #32770 et une partie du nom de la boite de dialogue (je dis bien une partie du texte) ?

    Merci beaucoup, cela me seras d'une grande utilité et un grand soulagement aussi

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    je me permet de faire un up.
    Pour precisez un peu plus, voici un exemple:
    Imaginons une barre de titre avec le texte à l'interieur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    partie qui change toujours puis celle qui change jamais
    En faite, il faut que je recuperer le handle grace à une partie du texte de la barre de titre, dans notre exemple, c'est puis celle qui change jamais

    Je pense que là, j'ai été un peu plus clair.
    C'est possible ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Bonsoir,

    D'apres une longue recherche, ce serais faisable avec la fonction pos
    function Pos(Substr: string; S: string): Integer;

    Description

    La fonction Pos recherche une sous-chaîne, Substr, à l'intérieur d'une chaîne S. Substr et S sont des expressions de type chaîne.

    Je ne vois pas comment l'adapter a ce que je veux faire.
    En attendant, je vais encore chercher.

  7. #7
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    Citation Envoyé par load.exe Voir le message
    Bonsoir,

    Comme je pense que tous ceci est flou, je vais decomposer le problème en plusieurs partie, ce seras beaucoup mieux.

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monhandle := FindWindow(nil, ma_fenetre);
    -FinWindow va bien retourner le numero de handle pour ma_fenetre.
    Ok, mais le problème est que le titre de ma barre de dialogue change de nom souvent, donc, je ne peut pas de cette façon.

    Je peut recuperer aussi un handle via le Classe Name :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monhandle := FindWindow('#32770', nil)
    Ok, mais le problème est que la classe est #32770 et que cette classe me renvoie le handle de Nero, donc, ce n'est pas une solution non plus.

    Donc, premiere question, comment puis-je recuperer le handle de cette fenêtre?
    Deuxieme question et suggestion, le nom de la barre de dialogue est jamais identique, cepandant ,les derniers mot, eux le sont.
    Donc, ne peut-ont pas identifier le handle via le classe name #32770 et une partie du nom de la boite de dialogue (je dis bien une partie du texte) ?

    Merci beaucoup, cela me seras d'une grande utilité et un grand soulagement aussi
    je n'ai pas tout saisi, mais j'ai tiqué sur la class #32770 (j'ai eu affaire à celle là). je crois savoir que c'est la class générique qu'utilisent certaines boites de dialogue, pas seulement Nero. malheureusement il n'y a pas de fonction qui recherche un handle avec juste un partie du nom de la boite de dialogue.
    mais tu peux chercher toutes les fenêtres ayant la class #32770 et ensuite, avec un pos retrouver la tienne. je ne sais plus si des appels successifs à FindWindow (paramètre lpWindowName à nil) retournent différents handles mais tu peux utiliser la fonction EnumWindows pour avoir ta liste de fenêtres.

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 16
    Points : 14
    Points
    14
    Par défaut un code que j'utilise assez efficace
    pour ma part j'utilise un composant TTimer setter à Off.
    Lors du lancement de ma fenêtre sur une action volontaire (par exemple un bouton qui lance un ShelleExecute (...blocNote) je déclenche mon timer : Timer1.enable := true;
    Sur l'évènement ontimer :

    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 TbgaNumerisationForm.Timer1Timer(Sender: TObject);
    var
     LeHandle:HWND;
     bStrMessage : string;
     PCTexte: array[0..254] of Char;
    begin
      timer1.Enabled := false;
      begin
        LeHandle := GetActiveWindow;
        GetWindowText(LeHandle,PCTexte,SizeOf(PCTexte));
        bStrMessage:=string(PCTexte);
        if bStrMessage='Sélectionner une source' then
        begin
          SendMessage(LeHandle, WM_Close	, 0, 0);
        end;
      end;
    end;
    En mode debug en te plaçant sur bStrMessage tu auras le texte de la fenêtre.
    Il te suffit alors de remplacer ce texte dans la condition if et le tour et jouer.

  9. #9
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    @lopezpacheco
    la fonction GetActiveWindow retourne le handle de la fenêtre active dans ton application.
    or ici il est question d'accéder à une application externe.

    bon il faut aussi voir que le sujet date de plus de 2 ans, peut être que load.exe a pu résoudre son problème.

Discussions similaires

  1. Récuperer le handle d'une application
    Par multimania dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 18/01/2012, 11h07
  2. Récupérer le handle d'une fenêtre précise
    Par AMS010 dans le forum Windows
    Réponses: 1
    Dernier message: 04/07/2008, 16h11
  3. Lancer une application à partir d'une application précise.
    Par Faith's Fall dans le forum C++Builder
    Réponses: 2
    Dernier message: 16/01/2007, 18h08
  4. Récupérer tous les handles d'une application choisie
    Par dacid dans le forum API, COM et SDKs
    Réponses: 13
    Dernier message: 21/04/2006, 16h24
  5. Comment retrouver le handle d'une application console?
    Par Laurent Dardenne dans le forum Windows
    Réponses: 7
    Dernier message: 22/12/2004, 16h58

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