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 :

[C#] Comment réaliser une WinForm fille d'une Application externe ? [FAQ]


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 103
    Points : 97
    Points
    97
    Par défaut [C#] Comment réaliser une WinForm fille d'une Application externe ?
    J'aimerai afficher un formulaire comme étant un enfant d'une application externe. Seulement la méthode ShowDialog prend en paramètre un objet de type :
    System.Windows.Forms.IWin32Window
    Comment je peux faire pour obtenir un objet de ce type qui représenterai mon application externe?

    En fait sur le moment j'ai pensé à récupérer d'abord le handle de l'application externe à partir de son titre via la méthode FindWindow() de la librairie user32.dll cependant le type retourné n'est pas IWin32Window, et je n'ai pas trouvé le moyen de caster ou transformer le handle de l'appli vers ce type...
    La solution serait-elle comme la vérité ? (ailleurs )

    Merci d'avance.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 103
    Points : 97
    Points
    97
    Par défaut
    Sur le net j'ai trouvé une fonction utilisée en VB6 : FindWindowLike (pratiquement la même que ci dessus mais permet de trouver l'application sans avoir le titre exacte)
    Existe t-elle pour C#?
    Personnellement je n'ai pas trouvé mais des fois que j'aurai mal vu...

  3. #3
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Excuses une ptite question
    Estce ton appli qui a lancé l'autre application
    sinon tu peux essayer de traduire la fonction FindWindowLike
    http://www.experts-exchange.com/Prog..._21289369.html
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 103
    Points : 97
    Points
    97
    Par défaut
    En fait mon développement est un add in pour word qui se lance automatiquement avec celui-ci. Je dispose donc d'un objet représentant l'application Word et ce que je voudrai faire c'est de faire de word le parent d'une IHM lancée par l'addin (l'addin me servant en quelque sorte de lancer mon appli en même temps que word).

    En fait, je ne voulais pas vraiment parler de mon histoire d'addin pour ne pas embrouiller ceux qui ne connaisent pas mais surtout pour rester général.

    Si deux applications (je dirai indépendantes) sont liées par quelque moyen, il est super important de pouvoir déclarer telle IHM/boite de dialogue fille de telle application (imaginez un message d'alerte qui serai caché derrière l'application parce qu'elle n'est pas déclarée fille de l'application...). C'est quelque chose d'indispensable pour tout module de programme et c'est ce que je voudrai faire seulement le probleme se pose avec la méthode d'affichage ShowDialog...
    Comment je peux récupérer un objet de type IWin32Window???
    Private Declare Function FindWindow Lib "user32" _
    Alias "FindWindowA" _
    (ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long


    Private Function FindWindowLike(hWndArray() As Long, _
    ByVal hWndStart As Long, _
    WindowText As String, _
    Classname As String) As Long
    Justement si quelqu'un peut me traduire sa en C# car je pense m'être gouré... D'ailleurs je ne sais pas à quoi correspond le 'alias' ni par exemple l'equivalent de hWndArray() ...

    Mais en fait je me demande si c'est utile de m'acharner à obtenir le handle de word car c'est du type System.IntPrt et il me faut IWin32Window...

  5. #5
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Ok oui je suis au courant, vous avez pas mal bosser avec Frechy
    Et tu avances super bien d'ailleurs (Félicitations)
    Pour ton souci du moment donc je n'avais pas posé innocemment la question en fait tu récupère bien un objet en lançant Word
    Cet objet ne pourrait-il pas te refiler son IWin32Window d'une fàçon ou d'une autre
    As-tu lancer Word en faisant un equivalent de GetObject par exemple... voilà comme tu le sais je ne suis pas meilleur que toi sur ce coup mais j'essayes de raisonner avec toi en espérant que çà ailles dans le bon sens
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 103
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par neguib
    Cet objet ne pourrait-il pas te refiler son IWin32Window d'une fàçon ou d'une autre
    C'est malheureusement ce que j'essaye de savoir mais je suis complétement dépassé... J'ai fouillé et refouillé tout les composant contenus dans la librairie de Word pour y trouver le moindre indice de IntPtr ou IWin32Window et nada... *au bord de la dépression nerveuse =) *
    As-tu lancer Word en faisant un equivalent de GetObject par exemple...
    Alors la c'est une méthode toute nouvelle et je t'avouerai que je ne l'ai jamais utilisé a part lors d'un recopiage d'un tuto *la honte*
    En fait de par la traduction en francais j'imagine qu'elle renvoie un objet... vu que le paramètre est un string, c'est certainement pour taper le nom du type.... Donc *fait le total* ah ben wé ... il faut que j'essaye

    Merci de ton soutiens

    PS : pour l'avancement moi je dis quand on est motivé, on progresse forcément. En plus comme j'aime la prog 8) et pire encore c'est en parti pour mon projet d'entreprise donc tout est la pour me faire avancer.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 103
    Points : 97
    Points
    97
    Par défaut
    Alors voici comment on peut faire pour obtenir les handle d'une fenêtre :
    Première méthode, par nom de classe / titre de l'application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    [DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
    public static extern IntPtr FindWindow(string ClassName, string WindowText);
    //...
     
    IntPtr hwnd = FindWindow("Notepad", null);
    if (hwnd != IntPtr.Zero)
    {
        // do something with the handle
        //...
    }
    else
        MessageBox.Show("Notepad is not running.");
    Deuxième méthode, en regardant dans les processus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    using System.Diagnostics;
    //...
     
    Process[] procs = Process.GetProcessesByName("Notepad");
    if (procs.Length != 0)
    {
        IntPtr hwnd = procs[0].MainWindowHandle;
        // do something with the handle
        //...
    }
    else
        MessageBox.Show("Notepad is not running.");
    Ensuite pour ce qui est de la classe IWin32Window
    Il faut réaliser un wrapper sur cette classe :

    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
     
    public class WindowWrapper : System.Windows.Forms.IWin32Window
    {
        public WindowWrapper(IntPtr handle)
        {
            _hwnd = handle;
        }
     
        public IntPtr Handle
        {
            get { return _hwnd; }
        }
     
        private IntPtr _hwnd;
    }
    Ensuite voila comment on peut l'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaForm.ShowDialog(new WindowWrapper(HandleAppliExterne));
    Ce qui nous donne une WinForm fille de l'application externe ! *Tadaaaa 8) *
    Alors un grand merci au Mr. ayant fait ce blog
    MAIS mon petit problème n'est pas entièrement résolu car cette fenêtre est modale alors que je la voudrai non modale.. Donc si vous savez vous pouvez me laisser un message (après le biiiip sonore ) et sinon dès que j'ai la soluce je la posterai

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 103
    Points : 97
    Points
    97
    Par défaut
    Alors la moi je dis VIVE LES APIs

    J'ai trouvé THE SOLUTION (imaginez la joie d'un développeur qui était au bord de la dépression nerveuse... )

    Alors tout simplement et très bêtement la méthode SetParent de user32.dll (quand tu nous tiens...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Déclaration de la forme fille
    System.Windows.Forms fenetre = new Form();
    ...
    // On récupère le handle de l'application mère
    IntPtr hwnd = FindWindow("ApplicationExterne", null);
    if (hwnd != IntPtr.Zero)
    {
    	// On établit le lien de parenté
    	SetParent(fenetre.Handle,hwnd);
    	// On affiche normalement
    	fenetre.Show();
    }
    C'est pas beau la vie?
    Je pense que si un Modérateur passe il devrait mettre ce topic en FAQ car je pense que je ne suis pas le seul à chercher à réaliser ce type de fonctionnalité.

    Voila!

  9. #9
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 125
    Points : 128
    Points
    128
    Par défaut
    la mettode showdialog affiche des fenetre modale
    et la methode show l'affiche en non modale

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 103
    Points : 97
    Points
    97
    Par défaut
    lol post croisé.
    Oui en effet la méthode show l'affiche bien en non modale mais en fait pourquoi avoir choisi showdialog au départ c'est parce qu'il y a la notion de propriétaire.

    Mais avec la solution ci dessus il n'y a plus de problème

  11. #11
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    alncool et merci pour ta solution
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  12. #12
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Bien vu ca, on met dans la FAQ

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    Quelle est la difference entre :

    1/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form.Show(DocumentHandle);
    et

    2/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [DllImport("user32.dll", SetLastError = true)]
    public static extern Int32 SetWindowLong(IntPtr hwnd, int nIndex, IntPtr dwNewLong);
     
    const int GWL_HWNDPARENT = -8;
    Win32.SetWindowLong(form.Handle,GWL_HWNDPARENT,DocumentHandle.Handle);

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/06/2007, 18h03
  2. Réponses: 18
    Dernier message: 03/01/2006, 18h53
  3. Réponses: 11
    Dernier message: 06/12/2005, 09h23
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 22h24

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