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 Forms Discussion :

Trouver handle et nom fenêtre appelante


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 249
    Par défaut Trouver handle et nom fenêtre appelante
    Salut à toutes et à tous.

    Je dois trouver le handle et le titre de la fenêtre à partir de laquelle j'appelle mon application.

    Qu'est-ce à dire ?

    Dans AutoCAD MAP 2004 J'ai crée un bouton qui, en LISP, ouvre une application que j'ai créée en C#.

    Le problème est que j'ai besoin, à partir de l'application, d'extraire des données d'AutoCAD.

    Si je démarre une nouvelle session d'AutoCAD à partir de l'application, je n'ai pas de pbl. Mais l'utilisateur final ne va pas passer beaucoup de temps à ouvrir de nouvelles instances d'AutoCAD et à les refermer au fur et à mesure. Il viendra me tapper dessus avant et il aura raison ...

    J'utilise, pour ouvrir AutoCAD à partir de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    using AutoCAD;
    ...
       publicstaticAcadApplication acad_app;
        publicstaticAcadDocument acad_doc;
     
       privatevoid OpenAcadDrawing(string DwgPath, bool ReadOnly)
       {
           try
           {
               acad_app = newAcadApplication();
               acad_doc = acad_app.ActiveDocument;
               acad_app.Application.Visible = true;
     
    ...
    Je pourrais rechercher tous les handle des fenêtres puis trouver celle qui commence par acad, mais si plusieurs instances d'AutoCAD sont ouvertes, comment savoir laquelle est l'instance appelante ?

    J'ai pensé à extraire le handle et le titre de la fenêtre active à l'ouverture de l'application (plus précisément j'ai essayé sur le load du premier form et dans le main du program.cs), puisque celle-ci est ouverte en lisp à partir d'une icone dans AutoCAD. La fenêtre active étant forcément la fenêtre de l'instance appelante.

    J'ai codé ceci qui me retourne effectivement le titre de l'application active :
    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
    [DllImport("user32.dll")]
    staticexternint GetForegroundWindow();
    [DllImport("user32.dll")]
    staticexternint GetWindowText(int hWnd, StringBuilder text, int count);
    privatestring GetActiveWindowTitle()
    {
       constint nChars = 256;
       int handle = 0;
       StringBuilder Buff = newStringBuilder(nChars);
       string ApplicationTitle = "";
       handle = GetForegroundWindow();
       if (GetWindowText(handle, Buff, nChars) > 0)
       {
           ApplicationTitle = Buff.ToString();
       }
       return ApplicationTitle;
    }
    Malheureusement, là où j'ai tenté d'utiliser ce bout de code (le load du premier form ou le main du program.cs), il me retourne invariablement "".
    Je pense que déjà ici il me sort le handle le mon application, mais ne retourne rien dans le titre puisqu'aucune fenêtre n'est encore ouverte.

    Comment trouver le Handle de l'application AutoCAD et, par extension, le titre de sa fenêtre ?

    Enfin, par extension, comment attribuer l'application AutoCAD ouverte et découverte à acad_app dans le premier bout de code ?

    Merci de vos z'avis z'avisés,
    Jean-Marc

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Par défaut
    Tu pourrais peut etre chercher du coté de l'API GetActiveWindow ...

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 249
    Par défaut
    Le résultat est malheureusement le même avec le code suivant :

    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
    
    [DllImport("user32.dll")]
    staticexternint GetActiveWindow();
    [DllImport("user32.dll")]
    staticexternint GetWindowText(int hWnd, StringBuilder text, int count);
    privatestring GetActiveWindowTitle()
    {
    
    constint nChars = 256; int handle = 0; StringBuilder Buff = newStringBuilder(nChars); string ApplicationTitle = ""; handle = GetActiveWindow(); //handle = GetForegroundWindow(); if (GetWindowText(handle, Buff, nChars) > 0) {
    ApplicationTitle = Buff.ToString();
    }
    return ApplicationTitle;
    }
    Je pense qu'en fait l'application étant démarrée mais pas qu'aucun form n'est encore affiché, l'application active est mon application et non AutoCAD. Et donc, comme aucune fenêtre n'est encore ouverte, le titre de la fenêtre est vide.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Par défaut
    un rapide coup d'oeil a Msdn m'a donné la fonction GetGUIThreadInfo qui est un "GetWindow" qui prend en plus en parametre le thread que tu souhaite interroger ...
    Jamais utilisé, je doute que ca te soit utile ... etant donné que tu ne connais pas plus le thread que la Form

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 249
    Par défaut
    En effet, je ne vois pas non plus comment faire à partir de cela. En fait il faudrait pouvoir utiliser le GetActiveWindow ou le GetForegroundWindow tout au début de l'application, AVANT que la fenêtre d'AutoCAD ne se désactive.
    J'ai constaté que la fenêtre de mon Visual Studio changeait de couleur avant que la commande ne passe. Mais ou la mettre pour qu'elle passe tout en début ? Je pense qu'il doit y avoir moyen de coder avant que la fenêtre ne soit ouverte, ou peut-être même créée. Mais où faut-il mettre le code ?

  6. #6
    Membre expérimenté Avatar de g_tarik0010
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 186
    Par défaut
    Bonjour,

    Je sais pas si j'ai bien compris ta question

    mais au moment de l'appel de ton appli tu pourrais lui donner comme parametres le nom et le handle de la fentere appelante
    Dans le boutton dans AutoCad qui demmare ton appli
    tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monAppli.exe "Nom de la fenetre", currentHandle;
    Je ne sais pas comment fonctionne AutoCad mais je pense que ce que j'ai dit est faisable
    et dans le main de ton appli tu recupere tes données

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/05/2010, 10h55
  2. Trouver un la handle d'une fenêtre cachée sans FindWindow()
    Par Jean-Philippe Shields dans le forum Windows
    Réponses: 3
    Dernier message: 24/02/2006, 12h08
  3. 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
  4. Réponses: 2
    Dernier message: 10/05/2005, 14h20
  5. Réponses: 2
    Dernier message: 14/03/2004, 22h04

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