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

Windows Discussion :

Pilotage: détecter le controle actif de n'importe quel soft


Sujet :

Windows

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Pilotage: détecter le controle actif de n'importe quel soft
    J'ai essayé pleins de méthodes (p'tet pas comme il faut?) et vois pas trop la solution. Si quelqu'un pouvait me mettre sur la bonne piste, je me posternerai (lol !!!). Mein problem:
    je dois piloter une application dont j'ai pas le code (faite avec Vantive), pour envoyer du texte dans ses diverses fenetres/zones d'édition,.... (importation de données d'excel vers Vantive/PeopleSoft). Mais l'appli est tres recalcitrante :

    >> Comme d'hab, j'essaie d'abord de chopper le dlgItemId des zones d'édition : Pas de chance ! les controles sont chargés en DYNAMIQUE dans TOUT le logiciel et je peux apparement(?) pas prévoir quel sera le prochain dlgItemId pour un controle précis (augmente sans arret). A 1ere vue, ce sera TRES difficile d'envoyer du texte directement dans les zones d'édition via WM_SETTEXT...

    >> Subclass, hook et Cie ? je peux en tout cas pas envisager de TOUT faire avec ca, car il est hors de question que mon utilitaire fasse planter le soft du client. Donc j'ai pas trop exploré....

    >> Donc je me rabat sur la bonne vieille méthode "séquentielle" avec : des sendkeys, keyb_event et Cie + sleep + séries de vbkeyTab pour passer au controle suivant. Ca marche pas mal jusqu'au moment où je tombe sur des gros pbs de temporisation du à la lenteur du soft que je dois piloter, l'encombrement du réseau, etc...
    Ceukispass: Parfois j'envoie des données pour le controle 2 alors qu'on est encore sur le controle 1 (latence dans le passage au controle suivant)

    ==============> Donc ma dernière solution de facilité <===============
    pouvoir connaitre le controle ayant le focus à l'intérieur du logiciel à piloter => pour envoyer le texte suivant que si c'est bien le bon qui a le focus.
    Et j'y arrive pô (d'ailleurs est-ce possible)

    >> GetFocus, GetCaretPos marchent pas pour une fenetre étrangère, mais seulement pour ses fenetres à soi (apparement rattaché au process en cours) (?)
    >> GetForegroundWindow donne la fenetre active, et non le controle actif à l'intérieur de cette fenetre. (?)

    y a pas un seul exemple sur internet sur ce pb ! à croire que c'est impossible : pourtant cette problématique parait assez classique !...

    Je sé pu koi fair... DONC, si je resume mon pb Actuel :
    Faut que je puisse connaitre le controle actif de n'importe quelle application (que ce soit mon application ou une application externe).
    Quelqu'un aurait-il une astuce ??

    Merci d'avance...


    ____________________________________________________________
    NB1:
    Je suis obligé de programmer sous VBA (insta des PC verrouillée) mais peut faire executer des progs en VB/VC++ que je compile chez moi avant.

    NB2: Ce que j'ai pas encore bien exploré:
    - hook/subclass et capter un message du genre WM_SETFOCUS si c'est bien ce message qui passe (mais ca parait complexe à détecter avec des fenetres MDI)
    - moyen quelconque de faire executer un getfocus PAR l'application que je veux espionner ?

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    3 338
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 338
    Points : 4 657
    Points
    4 657
    Par défaut
    déjà avec l'API GetActiveWindow tu peux recuperer l'application qui active.


    normalement l'api send_message doit te donner ce que tu veux.

  3. #3
    mat.M
    Invité(e)
    Par défaut
    Bonjour,

    importation de données d'excel vers Vantive/PeopleSoft
    tiens...tiens....
    J'ai déjà travaillé avec Vantive..

    je dois piloter une application dont j'ai pas le code, pour envoyer du texte dans ses diverses fenetres/zones d'édition,....
    Est-ce que c'est créer un script VBA sous PeopleSoft qui appelle un programme externe ???

    Comme l'a suggéré Goshiz , il faut voir toute la panoplie de fonctions API du MSDN comme FindWindow , EnumWindow etc.
    C'est assez ardu à mettre en place car effectivement dans un ERP il ya des temps de latence pour passer d'un bouton à un autre et les contrôles sont affichés dynamiquement.

    Je crois carrêment le mieux c'est de développer une appli dont le traitement est semblable à celle déjà toute faite car sinon grosse galère.

    Sinon la solution est de développer un Active X qui s'interface entre les 2

  4. #4
    Candidat au Club
    Inscrit en
    Décembre 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    salut
    je reviens juste de vacances. bonne année à tous et merci pour les réponses.
    --------------------------------------- Concernant la réponse de Goshiz --------------------------------------------
    > je suis en train de tester mais ca devrait pas marcher car getactivewindow fonctionne comme getfocus cad donne l'handle de la fenetre active pour le process courant. Càd le mien donc pas les fenetres du process extranger dont dépend vantive. J'ai peut-etre mal essayé mais je doute vraiment du resultat.

    ------------------------------------------- Concernant la réponse de Mat.M ------------------------------------------------
    "Est-ce que c'est créer un script VBA sous PeopleSoft qui appelle un programme externe ??? "
    En fait je suis sous VBA/Excel (source des infos à importer), et Vantive est déjà lancé (l'exe dont j'ai pas le code). Je dois pouvoir chopper le handle du process de Vantive sans pb. C'est le reste qui me pose des pbs.

    "Comme l'a suggéré Goshiz , il faut voir toute la panoplie de fonctions API "
    C'est ce que j'ai fait (trop rapidement?) mais j'ai toujours pas trouvé ce qu'il me faut. Getforegroundwindow marche sur un logiciel "étranger" mais donne la fenetre mère active, cad Vantive et non le controle actif à l'intérieur de cette fenetre (alors que setforegroundwindow fait les 2 !...). Donc je pense que c'est peut etre possible par un astuce du genre : je "parasite" vantive pour lui faire executer un getfocus dont je recupère le resultat ailleurs (subclassing, hook ou autre chose ?) . Mais la, je sèche complètement car ma connaissance limitée des process s'arrete la...

    " Je crois carrêment le mieux c'est de développer une appli dont le traitement est semblable à celle déjà toute faite car sinon grosse galère. "
    Impossible. le soft du client est un monstre....

    "Sinon la solution est de développer un Active X qui s'interface entre les 2"
    Connais pas les possiblités avec un active-X. Si t'as déjà travaillé avec vantive, et les active-X peut tu me dire si on pourrait alors exploiter des fonctionnalités de Vantive (exe active-X ?) pour "rentrer" dedans ?

    Merci

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    J'ai bien une idée, mais ça peut ne pas marcher (l'aide SDK précise que la fonction peut ne pas fonctionner dans certains cas) :

    - Déterminer l'ID du thread GUI de l'application cliente.
    - Utiliser AttachThreadInput, qui normalement, va relier la liste d'attente des messages, et permettra d'utiliser GetFocus, car les threads seront associés.

  6. #6
    Candidat au Club
    Inscrit en
    Décembre 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Victoire ! (Arf Arff...)
    Chapeau vector , c'était bien ca. Sûr, z'etes plus balezes que ds les aut'forum ici. J'y croyais plus: ca faisait 1 mois que je cherchais dans toutes les directions, tous les forums !.. J'étais presque sur la voie mais fallait le petit coup de pouce. Ca m'as permis de trouver 2 facon de détecter le controle actif quelque soit la fenetre .
    Bill le met pas en évidence dans MSDN, le cachotier ! (on tombe jamais sur un quelconque indice avec les "See Also" -trop puissant?-)

    Les 2 solutions, si ca peut servir à d'autres :

    1) Effet, la fonction AttachThreadInput permet bien de relier les messages d'un autre thread : ainsi getfocus peut devenir "global" à tout Windows, suivant la fenetre qu'on vise. (=> getactivewindow, getforegroundwindow, ...)

    CurrThreadID = GetWindowThreadProcessId(hWndMe, ByVal 0&)
    ExtThreadID = GetWindowThreadProcessId(hWndExt, ByVal 0&)

    Call AttachThreadInput(CurrThreadID, ExtThreadID , True)
    Retour= GetFocus
    '<-------- ou autre chose...
    Call AttachThreadInput(CurrThreadID, ExtThreadID , False)



    Et on peut normalement faire de meme avec toutes les API qui ne fonctionnent seulement qu'avec le thread courant. (setfocus, etc...).
    : Je comprend pas que cette astuce incontournable soit si difficile à trouver sur Internet.

    2) l'autre moyen qui est encore mieux :
    ( ds un timer, la sol 1 me parait un peu dangeureuse)

    En relisant ton post et en revoyant la liste des API , je suis repassé sur la liste des API dont GetGUIThreadInfo.... ... Et là T i L t ! G-U-I mais bien sur ! GetGUIThreadInfo permet d'extraire les infos tres utiles sur l'état de l'interface liée à un thread donné.

    Private Type GUITHREADINFO
    cbSize As Long
    flags As Long
    hwndActive As Long ' fenetre active (pop up, fille MDI etc..)
    hwndFocus As Long ' <-- CONTROLE ACTIF
    hwndCapture As Long
    hwndMenuOwner As Long
    hwndMoveSize As Long
    hwndCaret As Long
    rcCaret As RECT
    End Type

    Dim RetInfo As GUITHREADINFO
    RetInfo.cbSize = LenB(RetInfo)
    ThreadID = GetWindowThreadProcessId(hWndExt,ByVal 0&)
    if GetGUIThreadInfo(ThreadID, RetInfo) <> 0 then Retour=RetInfo.hwndFocus



    Cool. Grace à ca, je viens d'assurer définitivement le renouvellement de mon CDD (et peut-etre la fin de 1 an de chômedu) : maintenant, je suis certain que mon syst d'automatisation sera fiable à 99% et 3 fois plus rapide 8) (plus de temporisation à la con avec des sleep de parfois 2 secondes).

    A TOUS

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/06/2010, 08h35
  2. Réponses: 5
    Dernier message: 12/01/2009, 11h19
  3. Dévérouillage controle actif
    Par lito74 dans le forum Access
    Réponses: 3
    Dernier message: 30/03/2006, 18h10
  4. control actif?
    Par kakikaki dans le forum MFC
    Réponses: 2
    Dernier message: 09/10/2005, 15h14
  5. desactiver un control actif
    Par junty dans le forum Access
    Réponses: 4
    Dernier message: 13/09/2005, 16h11

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