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 :

Récupérer le Handle d'une Appli externe [Trucs & Astuces]


Sujet :

Windows

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut Récupérer le Handle d'une Appli externe
    Bonjour,

    Je suis en train de développer une dll et je voudrait lui affecter le handle d'une application .exe. Or je ne peut pas modifier le source de l'application donc il me faudrait pouvoir récupérer le handle de cette appli à partir de ma dll ...

    Quelqu'un aurrait une idée :

  2. #2
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    fonction FindWindow ....

    ca correspond apparement a ce que je veux faire ....
    mais ca marche comment ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    euh tu veux le handle ou l'hinstance?
    (handle pour la fenetre et hinstance opur le thread...)

    T'a hinstance=GetModuleHandle(nomdel'exe)

    pour le handle de la fenetre:
    -alors t'a effectivement findwindow mais je connais pas cette fonction...
    -Si la fenetre de l'exe que tu cherche est au premier plan (ce qui est la plupart du temps si l'exe appel la dll, enfin bon ok ça dépend des cas...)
    tu fais alors hwnd=GetActiveWindow()

    Hum sinon tu pourrais donner plus de précision sur ce à quoi tu souhaite ajouter ta dll?

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Handle sur quoi (quel type) ?

    T'a hinstance=GetModuleHandle(nomdel'exe)
    Ne marche pas, et ne veut rien dire pour les exe.
    Tous les exe sont mappés à la même adresse mémoire.

    Si la fenetre de l'exe que tu cherche est au premier plan (ce qui est la plupart du temps si l'exe appel la dll, enfin bon ok ça dépend des cas...)
    tu fais alors hwnd=GetActiveWindow()
    Ne marche pas non plus.
    Ca te renvoie la fenêtre active de ton thread, et pas d'un autre process.
    => GetForegroundWindow
    mais cette méthode est très bancale.

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Pour FindWindow, il faut lui fournir le titre de la fenêtre et sa classe.
    Utilise Spy++ pour avoir ces infos.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    T'a hinstance=GetModuleHandle(nomdel'exe)
    Hum je sais pas si ça marche pour les exes, en fait je l'utilise pour pour retouver l'hinstance de mes dll (et ça marche très bien)... donc désolé si ça marche pas...

    mais c bizzare si ça marche pas, car je tire ça de win32.hlp:
    Parameters

    lpModuleName

    Points to a null-terminated string that names a Win32 module (either a .DLL or .EXE file). If the filename extension is omitted, the default library extension .DLL is appended. The filename string can include a trailing point character (.) to indicate that the module name has no extension. The string does not have to specify a path. The name is compared (case independently) to the names of modules currently mapped into the address space of the calling process.
    If this parameter is NULL, GetModuleHandle returns a handle of the file used to create the calling process.
    La traduction n'est pas difficle...

    Si la fenetre de l'exe que tu cherche est au premier plan (ce qui est la plupart du temps si l'exe appel la dll, enfin bon ok ça dépend des cas...)
    tu fais alors hwnd=GetActiveWindow()
    Désolé j'ai oublié de dire qu'il faut que ça soit l'exe qui se serve de la dll...
    Dans ce cas-là ça marche très bien je l'uilise tous les jours

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Merci pour les infos...

    Age Piranha, c'est bien le handle que je souhaite récupérer, en fait je complète les fonctionnalitées d'une application basé sur un moteur graphique qui me permet d'executer des dll grace à un language propriétaire.

    Ces dll comportent en fait beaucoup d'interfaces de saisies (identification, boîte de selection ...) aussi il est important pour moi de pouvoir affecter l'affichage de ses interfaces "comme faisant partie de l'appli mère" donc sans instance dans la barre des tâches et sans rique que mes interfaces passent au second plan et donc que l'utilisateur ne les trouve pas.

    je vais aller voir spy++, je connais pas du tout ....

    merci.

  8. #8
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    ok c'est cool tout marche ....

    merci

  9. #9
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    par contre j'ai un autre souci maintenant ....

    donc ma form s'affiche bien dans le handle de mon appli par contre je perd complètement le curseur de ma souris .... impossible de sélectionner ou cliquer sur un élément .....



    ...

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Hum je sais pas si ça marche pour les exes, en fait je l'utilise pour pour retouver l'hinstance de mes dll (et ça marche très bien)... donc désolé si ça marche pas...

    mais c bizzare si ça marche pas, car je tire ça de win32.hlp:
    Tout d'abord méfies-toi du win32.hlp. Il commence à dater sérieusement.
    Comme aide mémoire c'est bien, pour apprendre c'est dépassé. Regarde la msdn ou l'aide du SDK.

    GetModuleHandle te renvoie l'adresse d'un module mappé dans l'espace virtuel privé de ton process.
    Chaque process possède son espace privé.
    Si un autre exe est présent, c'est en tant que module, donc autant dire en tant que dll. Tu récupères donc un handle sur l'exe, et non pas le process, car il n'y en a pas. Ca voudrait dire que plusieurs process se partagent le même espace d'adressage.

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Donne un peu de code.
    Pour info, handle tout court ça veut rien dire, c'est comme pointeur.
    Handle de quoi, pointeur sur quoi ?
    Dans ton cas, si j'ai bien compris, c'est un handle de fenêtre (!= "appli").

  12. #12
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    désolé effectivement je ne suis pas assez précis désolé, je débute en c++ et ces notion de handle je commence tout juste à maitriser ....

    Donc c'est bien du handle de fenêtre dont je parle.
    J'affecte l'affichage de ma form (affiché par la dll) dans le handle fenêtre de mon appli (.exe) appelant ma dll comme ceci :

    extern "C" __declspec(dllexport) int affiche(int argc, char **argv)
    {
    HWND OldHandle,HWnd;

    OldHandle = Application->Handle;
    Application->Handle = FindWindow("CCWin", 0);
    affect_param (argv[0],argv[1],argv[2]);
    TGetudvForm *GetudvForm;
    GetudvForm = new TGetudvForm(NULL);
    GetudvForm->ShowModal();
    sprintf(argv[1],getRetour().c_str());
    delete GetudvForm;
    Application->Handle = OldHandle;
    }


    Ma form s'affiche correctement, je peut sélectionner mes boutons et effectuer mes saisies à l'aide des contrôles claviers que j'ai mis en place sans problème parcontre le curseur de ma souris ne s'affiche plus lorsque je le déplace sur ma form, il m'est donc impossible de cliquer sur mes boutons ou de récupérer le focus sur ma form si jamais j'ai la bonne idée de cliquer sur la barre de titre de mon appli mère afin de lui rendre le focus momentanément.


    c'est assez clair ?


    merci
    [/img]

  13. #13
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Passe le handle en paramètre depuis VB ce sera plus simple.
    Application->Handle c'est quoi ?
    GetudvForm = new TGetudvForm(NULL);
    c'est quoi le paramètre attendu ? Ca serait pas la fenêtre parent des fois ?
    => GetudvForm = new TGetudvForm( Handle );

    sprintf(argv[1],getRetour().c_str());
    Ca c'est louche... ils sortent d'ou argc et argv ?
    Ca m'a l'air un petit peu cochon tout ça...

  14. #14
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    bon j'ai aussi oublié de dire que j'été sous Borland C++ 5 .....
    décidément .....

    Pour Application->Handle :

    TApplication encapsule une application Windows. Les méthodes et propriétés introduites par TApplication reflètent les mécanismes fondamentaux du système d'exploitation Windows pour créer, exécuter, gérer et détruire une application. TApplication simplifie l'interface entre le développeur et l'environnement Windows. Pour ce faire, TApplication encapsule des comportements qui permettent :

    Le traitement des messages Windows.
    L'aide en ligne contextuelle.
    Le traitement des raccourcis de menu et du clavier.
    La gestion des exceptions.
    La gestion des éléments fondamentaux d'une application tels que définis par le système d'exploitation Windows, comme MainWindow, WindowClass, etc.

    Chaque application C++Builder déclare automatiquement une variable Application comme l'instance de l'application. Si l'application C++Builder n'est pas une application de serveur Web, une applet de panneau de configuration ou une application de service NT, cette variable est du type TApplication.

    en bref ca me permet de récupérer le handle de fenêtre de ma dll.

    pour ce truc là je me suis basé sur cet exemple : http://lfe.developpez.com/DLL/

    pour argv argc : ils sont défini dans la déclaration de ma méthode ...
    la méthode affiche() est en fait la méthode appelé pour afficher mon composant auquel je passe des paramètres (argv), argc correspond lui aux nombres d'éléments passé en paramètre .... (c'a pas du C pur ça ?)

    quand au sprintf il me permet de renvoyé une fois mon traitement terminé la valeur saisie par l'utilisateur (dans le cas d'une dll boîte de saisie ) à mon appli source et de continuer le traitement c'est un truc qui marche très bien.

    pour GetudvForm = new TGetudvForm(NULL);

    oui pas con je faire le test ...

    enfait non il apprécie pas du tout ... pourtant il semblerai qu'il soit possible d'affectuer un handle de fenêtre en le passant comme paramètre mais le compilo n'apprécie pas ...


    merci

  15. #15
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    (c'a pas du C pur ça ?)
    Si, et c'est bien ça le problème.
    Tu tests pas argc.
    Pkoi ne pas plus simplement prendre 3 paramètre auxquels tu donnes des noms explicites.

    enfait non il apprécie pas du tout ... pourtant il semblerai qu'il soit possible d'affectuer un handle de fenêtre en le passant comme paramètre mais le compilo n'apprécie pas ...
    Dans le lien que tu m'a filé, c'est exactement ce qui est fait...
    http://lfe.developpez.com/DLL/#L7

    C'est quoi le pblm en VB ?

  16. #16
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    hum en fait je crois que ca vient pas de ma dll mais de mon appli mère ....
    je vais voir ca auprès du support ...
    enfin merci pour tes conseils ....

    @+

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/04/2007, 13h25
  2. [DELPHI 5] Minimiser une appli externe
    Par VincentB dans le forum Delphi
    Réponses: 2
    Dernier message: 15/05/2006, 15h54
  3. [Système][Runtime]J'arrive pas à lancer une appli externe !?!
    Par polnioumane dans le forum Général Java
    Réponses: 6
    Dernier message: 16/11/2005, 18h55
  4. Coment récupérer le handle d'une fenêtre
    Par robocop2776 dans le forum MFC
    Réponses: 2
    Dernier message: 30/10/2005, 22h21
  5. Réponses: 3
    Dernier message: 26/09/2005, 10h41

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