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

WinDev Discussion :

Exécuter une Application non Windev uniquement dans une fenetre Windev [WD17]


Sujet :

WinDev

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut Exécuter une Application non Windev uniquement dans une fenetre Windev
    Bonjour,

    J'ai un PC sur lequel tourne 2 applications :
    - 1 application windev que j'ai développée
    - 1 application d'automatisme WinCC (le nom est peu important, cela pourrait être une application comme le bloc note, paint...etc)

    Le passage d'une application à l'autre est très peu convivial; il faut soit cliquer sur la barre des taches soit appuyer sur ALT+TAB.

    Est-il possible que je crée dans mon développement Windev, une fenêtre (que j'ouvrirai ou afficherai comme les autres fenêtres Windev) dans laquelle s’exécuterait mon application ?

    Je vous remercie par avance de vos aides et pistes.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Oui, c'est possible vous devez changer le parent de la fenêtre externe et lui assigner le handle de votre fenêtre principale WinDev comme parent.

    Ceci se fait grâce à l'utilisation de l'API Windows SetParent.
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    ...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut
    Merci Patrice,

    Je ne maitrise pas totalement Windev et je ne vois pas comment je peux appliquer ta méthode avec les API Windows et Windev.
    Merci par avance si tu peux m'aider ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    C'est le même principe que les fenêtres internes.

    ...

  5. #5
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Bonsoir,

    C'est effectivement intéressant, ont peut intégrer une fenêtre d'une application externe comme une fenêtre interne dans son application Windev ?

    Après quand on ne maîtrise pas bien les API, cela deviens difficile à mettre en place...

  6. #6
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    J'ai trouvé ça, si ça peut aider

    http://centrewd.free.fr/?page=ficheapi&t=f&n=SetParent

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut
    Merci WDKyle.

    Effectivement ton exemple m'aide beaucoup.

    Mon problème est : comment récupérer le Handle de la fenêtre de mon application externe (qui peut être le bloc note, paint....) pour l'inclure dans une fenêtre windev en s'inspirant du code ci dessous ?

    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
     
    // On change un bouton d'une fenêtre à une autre
    // Créer pour cela, une fenêtre mère MDI qui contient un
    // bouton de votre choix et une fenêtre fille
     
    hWndNouvFen, hWndBouton sont des entiers
     
    OuvreFille("Fifille") // Nom de la fenêtre fille
     
    hWndNouvFen = Handle("Fifille")
    // Du code qui vous est offert par Beaussier en ligne
    hWndBouton = Handle("UnBouton") // Nom du bouton
     
    AppelDLL32("user32", "SetParent", hWndBouton, hWndNouvFen)
    // Le bouton a changé de fenêtre,
    // il est passé de la mère à la fille !

  8. #8
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Bonjour,

    Tu devrais pouvoir récupérer le handle de l'application externe avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonHandle = API("USER32", "FindWindowA", Null, "Nom Application")

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Il est plus sûr d'utiliser le nom de la classe de la fenêtre popup que vous voulez capturer, car le titre peut changer...

    SpyXX permet de connaitre ce genre d'information.

    ...

  10. #10
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    pour illustrer ce que viennent d'écrire WDKyle et Patrice, voici un exemple concret qui affiche le handle de la fenêtre du programme notepad ouvert et sans fichier chargé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HandleFenExt est un entier
    // Handle Fenêtre par classe ( le nom de la classe est à trouver par spyxx) 
    HandleFenExt = API("USER32", "FindWindowA","Notepad", Null)
    Trace("Handle fenêtre par classe  : ",HandleFenExt)
    // Handle Fenêtre par titre de fenêtre
    // HandleFenExt = API("USER32", "FindWindowA", Null, "Sans titre*- Bloc-notes") équivalent à 
    HandleFenExt = SysFenHandle("Sans titre*- Bloc-notes")
    Trace("Handle fenêtre par titre  : ",HandleFenExt)
    Il y a une autre méthode en partant de l'exécutable de la fenêtre du programme à intégrer, mais c'est plus compliqué puisqu'il faut énumérer tout d'abord tous les processus qui tournent.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  11. #11
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    727
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 727
    Points : 1 646
    Points
    1 646
    Par défaut
    Avoir une fenêtre parente appartenant à un thread différent est considéré comme une mauvaise pratique, avec des risques d'interblocage (sur les SendMessage() notamment, cf. SendMessageTimeout()).

    Alors l'avoir carrément dans un processus différent, ça me paraît assez osé.

    Ceci dit, ça semble bien fonctionner en prenant soin de :
    - Supprimer les bordures de la fenêtre fille (cf. GetWindowLong() et SetWindowLong() pour GWL_STYLE, et supprimer WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU).
    - Positionner la fenêtre en 0, 0 (cf. SetWindowPos), car la position devient relative à la fenêtre mère.
    - Ne rien poser comme champ par-dessus.

    Pour récupérer proprement le handle de la fenêtre, il faudra faire un LanceAppli() avec exePID pour récupérer le process id, puis utiliser EnumWindows() et GetWindowThreadProcessId() pour rechercher la fenêtre.

    Vous aurez probablement besoin des fonctions FenIntLarg() et FenIntHaut() également.

  12. #12
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    727
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 727
    Points : 1 646
    Points
    1 646
    Par défaut
    Voici un petit exemple en WD17.
    C'est une fenêtre qui ouvre notepad.
    Fichiers attachés Fichiers attachés

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Pas de lien direct avec la question posée.

    Cependant SetParent permet également de créer une fenêtre de type "Message-Only", en utilisant la constante HWND_MESSAGE à la place du handle parent.
    Ce type de fenêtre est invisible, n'a pas de z-order et ne peut pas être énumérée, mais elle peut traiter tous les messages qu'on lui envoie.
    On entre ici dans un domaine réservé aux spécialistes et... aux hackeurs (ce qui est synonyme)

    ...

  14. #14
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    727
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 727
    Points : 1 646
    Points
    1 646
    Par défaut
    Il faudra aussi faire un hook sur le WM_DESTROY pour détecter quand l'utilisateur quitte l'application, pour fermer la fenêtre WinDev.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Laos

    Informations forums :
    Inscription : Mars 2003
    Messages : 552
    Points : 1 193
    Points
    1 193
    Par défaut
    Bonjour,

    j'ai regardé votre exemple, et je ne connaissais pas la syntaxe employé (en rouge) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nStyle = nStyle & ~(0x00C00000 | 0x00040000 | 0x20000000 | 0x01000000 | 0x00080000)
    Pouvez-vous m'éclairer sur cette syntaxe svp ?

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Laos

    Informations forums :
    Inscription : Mars 2003
    Messages : 552
    Points : 1 193
    Points
    1 193
    Par défaut
    Désolé du double-post

    Je viens de comprendre l'utilisation des opérateurs binaires
    http://doc.pcsoft.fr/fr-FR/?3050038&...naire_fonction

    Par contre reste à comprendre l'adressage du pointeur avec '~'

  17. #17
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    727
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 727
    Points : 1 646
    Points
    1 646
    Par défaut
    Ce sont uniquement des opérateurs bit à bit.
    • | : ou (comme en C/Java)
    • || : ou exclusif (^ en C/Java)
    • & : et (comme en C/Java)
    • ~ : non (comme en C/Java)

    Doc : http://doc.pcsoft.fr/fr-FR/?1512009

    Il n'est pas question de pointeur ici.

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Laos

    Informations forums :
    Inscription : Mars 2003
    Messages : 552
    Points : 1 193
    Points
    1 193
    Par défaut
    Super, j'ai compris !

    merci bcp

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut
    Merci à tous pour vos aides

  20. #20
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Tu as réussi ? Cela donne quoi visuellement au final ?

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

Discussions similaires

  1. Interet d'une structure N-layers dans une application non web
    Par rvzip64 dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 20/03/2012, 13h23
  2. [XL-2007] Copier les données d'une cellule dans une Application non Office en VBA
    Par EmmanuelleC dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 11/05/2010, 14h27
  3. Détecter keyPressed dans une application non graphique
    Par adilou1981 dans le forum Général Java
    Réponses: 11
    Dernier message: 09/07/2009, 12h08
  4. Réponses: 40
    Dernier message: 21/06/2007, 17h58
  5. Lancer un et un seul thread unique dans une application web
    Par rach375 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 22/09/2006, 15h35

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