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

C# Discussion :

Comment récupérer les informations d'une fenêtre dans autre application? [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 11
    Par défaut Comment récupérer les informations d'une fenêtre dans autre application?
    Bonjour,

    Au sein de mon travail il y a une application permettant de suivre l'état de certains appareils au sol via des caméras. Cette application est alimenté par des vidéos qui représente le passage au-dessus de ces appareils. D'un autre côté des lasers mesures certaines données relatives à ces derniers. Un graphique peut être extrait des mesures lasers.
    3 fenêtres de visualisions vidéos (3 angles différents) sont disponible. Et on peut afficher une petite fenêtre pop-up sur n'importe laquelle de ces 3 fenêtres.
    Mon but est de pouvoir récupérer certaines informations contenues dans cette pop-up.
    Si je peut récupérer le temps (qui change continuellement en fonction de l'avancement de la vidéo) je pourrais synchroniser les données laser du graphique avec la lecture des vidéos.
    Voici un code que j'ai réussi à trouver, mais je n'arrive pas à accéder à la fenêtre pop-up s'intitulant "Track information - RailCheck" fille de la fenêtre "ImageViewer - RailScan FrontRear"
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
     
    namespace ConsoleApplication2
    {
        class Program
        {
     
            static void Main(string[] args)
            {
                List<WinText> windows = new List<WinText>();
     
                //find the "first" window
                IntPtr hWnd = FindWindow("Track Information - RailScan", null);
     
                while (hWnd != IntPtr.Zero)
                {
                    //find the control window that has the text
                    IntPtr hEdit = FindWindowEx(hWnd, IntPtr.Zero, "edit", null);
     
                    //initialize the buffer.  using a StringBuilder here
                    System.Text.StringBuilder sb = new System.Text.StringBuilder(255);  // or length from call with GETTEXTLENGTH
     
                    //get the text from the child control
                    int RetVal = SendMessage(hEdit, WM_GETTEXT, sb.Capacity, sb);
     
                    windows.Add(new WinText() { hWnd = hWnd, Text = sb.ToString() });
     
                    //find the next window
                    hWnd = FindWindowEx(IntPtr.Zero, hWnd, "Track information - RailCheck", null);
                }
     
                //do something clever
                windows.OrderBy(x => x.Text).ToList().ForEach(y => Console.Write("{0} = {1}\n", y.hWnd, y.Text));
     
                Console.Write("\n\nFound {0} window(s).", windows.Count);
                Console.ReadKey();
            }
     
            private struct WinText
            {
                public IntPtr hWnd;
                public string Text;
            }
     
            const int WM_GETTEXT = 0x0D;
            const int WM_GETTEXTLENGTH = 0x0E;
     
            [DllImport("user32.dll", SetLastError = true)]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
     
            [DllImport("user32.dll", SetLastError = true)]
            public static extern int SendMessage(IntPtr hWnd, int msg, int Param, System.Text.StringBuilder text);
     
            [DllImport("user32.dll", SetLastError = true)]
            public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
     
        }
    }
    Est-ce que quelqu'un a une idée de la façon de s'y prendre ?
    En pièce jointe la photo de la fenêtre en question et de sa pop-up. et la 2eme image correpsond à la capture des informations de la pop-up par le logiciel WinSpy++. Si ça peut aider... MERCI :D

    Cordialement,
    Ephem
    os : Win 7 pro SP1
    ide : MS Visual studio Express 2013
    Images attachées Images attachées   

  2. #2
    Membre Expert Avatar de ed73170
    Homme Profil pro
    Développeur indépendant
    Inscrit en
    Mai 2009
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur indépendant

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    Par défaut
    Bonjour,

    Le premier FindWindow pour trouver la popup est bon. Par contre pour la suite il faut utiliser GetDlgItem si tu as besoin du contrôle ou GetDlgItemText si tu veux juste récupérer les données.

    Le paramètre nIDDlgItem est l'identifiant du contrôle (ControlID) que tu vois avec Spy++.

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    le plus simple serait d'utiliser ta propre application agrégeant toutes ces informations.

    Afficher la vidéo d'une webcam dans une application C#, c'est plutôt simple.. donc, je pense que faire ainsi serait beaucoup plus propre que d'aller
    lire une info dans une messagebox...

    Surtout si il s'agit d'une application professionnelle et industrielle, il faut trouver une solution plus sure que celle que tu envisages...

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 11
    Par défaut
    Merci ed73170 pour ta rapide réponse. Mais le seul petit hic c'est que je me doutais que le premier FindWindow était bon ( avec le nom de la fenêtre passé en param) , et cette ligne ne retourne rien, elle ne fonctionne pas. Je ne peut donc pas utiliser les prochaines fonctions que tu m'as données.

    theMonz31 : je ne peut faire ce que tu dis car les vidéos sont encryptées et de plus dans un format bien spécifique. Je ne peut pas toucher à l'application qui permet de lire les vidéos.

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    si le premier findWindow te retourne null, c'est que le nom de la fenetre ne doit pas être le bon...

    le lien suivant te permet d'avoir une fonction pour récupérer le nom de toutes les fenetres que tu as dans
    ton environnement...

    http://www.tcx.be/blog/2006/list-open-windows/

  6. #6
    Membre Expert Avatar de ed73170
    Homme Profil pro
    Développeur indépendant
    Inscrit en
    Mai 2009
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur indépendant

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    Par défaut
    C'est probablement parce que tu passes les paramètres à l'envers, tu devrais essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindWindow(null, "Track Information - RailScan");

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 11
    Par défaut
    ah oui ... je viens de tester.
    C'est ça aussi de récupérer du code en ligne en faisant confiance. J'aurais du regarder plus en détail l'ordre des paramètres.
    Entre temps je suis parti sur la solution de theMonz31 qui m'a l'air de fonctionner, j'arrive à boucler sur les différentes fenêtres.
    Merci pour votre aide.

    Maintenant que je récupère la fenêtre en question, il me faut encore récupérer le texte non pas du caption (ou du titre) mais celui de l'interieur. Je pars donc en investigation sauf si vous avez une fonction du genre GetListeItem sous la main.
    Vu la fonction GetOpenWindows() que theMonz31 a donnée, il doit bien y en avoir une pour récupérer tous les contrôles à l’intérieur d'une Window.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 11
    Par défaut
    Bonjour,

    J'ai essayé ce petit bout de 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #region methode2
    IDictionary<HWND, string> lst = OpenWindowGetter.GetOpenWindows();  //on récup toute les fenêtres actives
    System.Text.StringBuilder sb = new System.Text.StringBuilder(1000);  //initialisation du stringBuilder
     
    foreach (System.Collections.Generic.KeyValuePair<HWND,string> window in lst )
    {//pour chaque fenêtre active
        if (window.Value.Equals("Track information - RailScan"))   //on test le nom de la fenêtre
        {//si c'est la fenêtre d'informations que l'on veut
            //int id = int.Parse("00400000", System.Globalization.NumberStyles.HexNumber);    //on récupère l'id en hexa du control qui a le temps
            int id = int.Parse("000003F5", System.Globalization.NumberStyles.HexNumber);
            IntPtr h_txt = GetDlgItem(window.Key, id);     //on récupère le control avec le temps
            h_txt = GetDlgItem(window.Key, 0x3F5);         //on récupère le control avec le temps
            h_txt = GetDlgItem(window.Key, 0x400000);      //on récupère le control avec le temps
            GetDlgItemText(h_txt, id, sb, 1000);  //on récup le texte contenu dedans
            //Marshal.GetLastWin32Error();    //pour avoir la dernière erreur soulevée
            int RetVal = SendMessage(h_txt, WM_GETTEXT, sb.Capacity, sb);   //récup le text contenu dans le control et le met dans le sb
            GetDlgItemText(h_txt, GetDlgCtrlID(h_txt), sb, 1000);
        }
        Console.WriteLine("{0}: {1}", window.Key, window.Value);
    }
     
    Console.WriteLine(sb.ToString());
    Console.ReadKey();
    #endregion
    En piece-jointe on peut voir les instance Handle et ControlID du contrôle contenant le temps (valeur que je veux récupérer)
    j'ai essayer de passer en nt ou meme de les utiliser tel quel... a chaque fois le GetDlgItem me retourne un handle vide.

    Avez-vous des idées?
    MerciNom : ControlID_winSpy.png
Affichages : 2390
Taille : 92,9 Ko

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/07/2010, 12h59
  2. [AC-2000] Comment récupérer les informations d'une listbox
    Par Remus91 dans le forum IHM
    Réponses: 2
    Dernier message: 26/05/2009, 14h53
  3. Réponses: 3
    Dernier message: 13/03/2009, 15h20
  4. Réponses: 3
    Dernier message: 10/03/2006, 14h15

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