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 :

Spécifier la fenêtre parent à partir de createProcess()?


Sujet :

Windows

  1. #1
    Membre averti Avatar de Jean-Philippe Shields
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2005
    Messages : 278
    Points : 340
    Points
    340
    Par défaut Spécifier la fenêtre parent à partir de createProcess()?
    Bonjour à tous,

    J'aimerais intégrer plusieurs processus externes exécutable (.exe) qui possèdent des interface graphiques à l'intérieur d'un environnement que je développe (pour les regrouper facilement). Présentement, j'utilise createProcess() pour lancer les différents logiciels et ensuite j'utilise la fonction setParent() pour les intégrer. Ceci me cause certains problèmes et j'aimerais pouvoir être capable de les intégrer directement en spécifiant le parent dans l'opération createProcess(). Je sais que STARTUPINFO possède un argument (le 3e) : LPTSTR lpDesktop qui permet de passer le nom du desktop ou du window station à utiliser, mais je ne sais pas tout à fait si c'est ce que je cherche ni comment l'utiliser si c'est la solution à mon problème.

    Toutes les idées pouvant m'aider (autres pistes de solution) sont les bienvenues. Merci à l'avance
    RCP rulez!

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne crois pas que tu puisses...

    Pour faire ce genre de truc, on utilise généralement COM/OLE2/ActiveX...
    (Et le plus souvent, les programmes en question sont sous forme de DLL. mais pas toujours).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    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 751
    Points : 10 671
    Points
    10 671
    Billets dans le blog
    3
    Par défaut
    Moui, c'est pas une très bonne façon ce que tu fais.
    Si tu veux continuer dans cette voie, tu peux passer en paramètre sus forme de texte le handle du parent.
    Mais il vaudrait mieux avoir une approche composant logiciel, au minimum via des dll plug-in chargées par l'application mère.

  4. #4
    Membre averti Avatar de Jean-Philippe Shields
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2005
    Messages : 278
    Points : 340
    Points
    340
    Par défaut
    Merci des réponses.

    Ouais, je comprends. Cependant certaines restrictions comme les logiciels à intégrer sont incontournables et ces logiciels n'ont pas de partie COM/OLE/ActiveX comme Word ou un browser.

    Pour donner plus de détails; je dois intégrer ces logiciels dans un environnement de développement java nommé Eclipse. Je dois alors passer par JNI ce qui complique légèrement les choses. Présentement, le prototype est complet: les logiciels s'intègre, mais pas de manière très élégante (d'où ma question).

    Je vais essayer le handle sous forme de parent (idée de Aurelien) et je vous tiens au courant.
    RCP rulez!

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    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 751
    Points : 10 671
    Points
    10 671
    Billets dans le blog
    3
    Par défaut
    Il me semble qu'il y a ce qu'il faut en Java pour s'interfacer avec COM. Et surtout, je ne connais pas Eclipse, mais méfies toi, les fenêtre Java SWING sont à part, ce ne sont pas de classiques fenêtres Win32. Pour AWT je sais pas trop dans quelle mesure tu peux mixer.
    D'un point de vue Windows, une appli Java SWING c'est une seule fenêtre principale. Tout ce qu'il y a dedans, il n'en n'a pas connaissance (joue avec Spy++ pour te faire une idée).

  6. #6
    Membre averti Avatar de Jean-Philippe Shields
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2005
    Messages : 278
    Points : 340
    Points
    340
    Par défaut
    Merci du conseil, mais Eclipse travaille avec SWT (Standard Widget Tollkit) qui sont natifs au Os sur lesquels ils roulent (l'avantage est que je peux avoir directement accès, dans la partie Java, au handle de la fenêtre que j'ai créée.

    J'ai fait quelques tests avec createProcess et le lpDesktop de STARTUPINFO, mais ce pointeur est supposé passer le nom d'une station window dans lequel le programme doit rouler. Si je passe une valeur quelconque (J'ai essayé de mettre le handle de la fenêtre parent en texte), la fonction createProcess retourne valide, le gui du programme ne s'affiche pas, mais on le retrouve dans le Task Manager! As-tu déjà utilisée cette technique et réussit? J'ai découvert un article sur CodeProject qui emplique ce comportement.
    http://www.codeproject.com/buglist/d...id=15186&exp=0

    Pour ce qui est du COM, je n'y connais rien. Est-il possible de l'utiliser pour communiquer même si mon logiciel (à intégrer) n'est fait pas usage, comme la calculatrice ou notepad.

    Si aucun lien n'est possible entre createProcess et createWindow pour le handle du parent. J'avais pensé à utiliser Detours de MS pour hooker createWindow et lui passer mon handle directement. Qu'en pensez-vous?
    RCP rulez!

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    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 751
    Points : 10 671
    Points
    10 671
    Billets dans le blog
    3
    Par défaut
    Pour lpDesktop tu fais fausse route. lpDesktop, ben c'est le bureau, ce que tu as à l'écran quoi. Ca sert à créer des applis sur l'écran d'un autre utilisateur connecté, etc...
    Je cmprend pas pourquoi tu veux hooker ton propre CreateWindow aussi. Vu que c'est ton code, pourquoi ne pas spécifier le parent voulu lors de l'appel à CreateWindow ?
    Pourquoi ne développes-tu pas ton plugin en Java ?

  8. #8
    Membre averti Avatar de Jean-Philippe Shields
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2005
    Messages : 278
    Points : 340
    Points
    340
    Par défaut
    Je me suis probablement mal expliqué, alors je vais essayer de donner plus de détails.

    1. Je développe un client (prototype) RCP (Rich Client Pllateform) en Java à partir du framework d'Eclipse pour pouvoir récupérer plein de fonctionnalité d'Eclipse déjà développées. On gagne du temps.

    2. Le client RCP est un environnement dans lequel on veut rassembler pleins d'outils spécifiques (autres logiciels qui peuvent être commerciaux) qui n'ont pas été développés par nous (on a pas les sources non plus).

    3. Comme on veut intégrer ces autres logiciels dans le client RCP Java, on utilise l'API windows en passant par JNI pour changer le handle de la fenêtre parent des logiciels à intégrer (desktop) pour une fenêtre créé en Java (par des SWT) dans le client RCP.

    4. Le problème est que ce changement de handle parent (setParent(...)) se fait présentement après que le logiciel soit lancé (par createProcess(...)). Ce qui introduit une latence et c'est un peu chiant.

    5. Je sais que quand le logiciel est lancé par createProcess, certains paramètres sont transférés à createWindow(...) (auquel je n'ai pas accès car c'est le logiciel commercial qui utilise ça) comme le size de la fenêtre son emplacement dans l'écran... Moi je voulais trouver un lien entre les 2 fonctions pour passer le handle de la fenêtre parent que je veux (pas le desktop) pour que je ne soit plus obligé d'utiliser la fonction setParent(...).

    6. Alors c'est pourquoi je voulais intercepter (hooker) l'API createWindow pour savoir quand le logiciel allait l'appeler pour lui passer le handle parent que je veux et non pas le desktop.

    7. Comme Médinoc disait COM/OLE2/ActiveX... pourrait facilement être utilisé si les logiciels à intégrer utilisaient ces composants. J'ai déjà facilement intégré des logiciels externes comme IE ou Word ou Acrobat Reader qui comportent tous des composants ActiveX.

    8. Une autre solution possible seraient de passer un paramètre SW_HIDE aux logiciels par createProcess(...) (STARTUPINFO) pour ne pas voir le logiciel externe, ensuite changer son parent et le rendre visible après.

    Ce que je cherche c'est des pistes de solutions pour changer le parent tout en étant le plus discret possible. Car quand je lance le logiciel externe, il apparaît fullscreen et après l'intégrer c'est un peu chiant pour l'utilisateur.
    RCP rulez!

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/12/2010, 19h29
  2. Réponses: 4
    Dernier message: 08/11/2009, 21h21
  3. Actualiser une fenêtre parent à partir d'une popup
    Par scorian dans le forum WebDev
    Réponses: 1
    Dernier message: 22/08/2007, 09h50
  4. Valider un form et lancer le résultat ds la fenêtre parent
    Par [DreaMs] dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 23/08/2005, 17h01
  5. Fenêtre parent
    Par adelavarenne dans le forum Composants VCL
    Réponses: 9
    Dernier message: 20/10/2003, 14h44

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