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#

  1. #1
    Membre à l'essai
    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
    Points : 10
    Points
    10
    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
    Expert confirmé 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 : 62
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    Points : 5 522
    Points
    5 522
    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
    Points : 5 195
    Points
    5 195
    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...
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  4. #4
    Membre à l'essai
    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
    Points : 10
    Points
    10
    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
    Points : 5 195
    Points
    5 195
    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/
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  6. #6
    Expert confirmé 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 : 62
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    Points : 5 522
    Points
    5 522
    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 à l'essai
    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
    Points : 10
    Points
    10
    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 à l'essai
    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
    Points : 10
    Points
    10
    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 : 2158
Taille : 92,9 Ko

  9. #9
    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
    Points : 5 195
    Points
    5 195
    Par défaut
    Tiens prend ce code:

    Il liste toutes les fenetres ouvertes, si l'un correspond contient "Mise" (j'utilise la mise en page du notepad pour mon test), il affiche le contenu de tous les controles
    de la fenetre (text ou contenu suivant le type du controle...)

    Je pense que dans ton cas, souvent, le handle de la textbox contenant ton information va changer...
    Mais si tu as un peu de chance, tu peux espérer que le controle se trouvant "après" le label qui te convient soit la valeur à utiliser...

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
     
    public partial class Form1 : Form
        {
            [DllImport("USER32.DLL")]
            static extern int GetWindowText(HWND hWnd, StringBuilder lpString, int nMaxCount);
     
            [DllImport("USER32.DLL")]
            static extern int GetWindowTextLength(HWND hWnd);
     
            [DllImport("USER32.DLL")]
            static extern bool IsWindowVisible(HWND hWnd);
     
            [DllImport("USER32.DLL")]
            static extern IntPtr GetShellWindow();
     
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [Out] StringBuilder lParam);
     
     
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                Form f = new Form();
                f.Text = "Salut papa";
                f.Show();
     
                GetInfo();
            }
     
            private void GetInfo()
            {
                foreach (KeyValuePair<IntPtr, string> window in OpenWindowGetter.GetOpenWindows())
                {
                    IntPtr handle = window.Key;
                    string title = window.Value;
     
                    if (title.Contains("Mise"))
                    {
                        // On s'amuse avec le bazar...
                        List<IntPtr> children = GetChildWindows(handle);
                        foreach (IntPtr fils in children)
                        {
                            int length = GetWindowTextLength(fils);
                            if (length == 0)
                            {
                                string a = GetText(fils);
                                Trace.WriteLine("Text : " + a);
                            }
                            else
                            {
                                StringBuilder builder = new StringBuilder(length);
                                GetWindowText(fils, builder, length + 1);
                                string result = builder.ToString();
                                Trace.WriteLine(result);
                            }
                        }
     
                    }                
                }
            }
     
            private static string GetText(IntPtr handle)
            {
                const uint WM_GETTEXTLENGTH = 0x000E;
                const uint WM_GETTEXT = 0x000D;
     
                // Gets the text length.
                var length = (int)SendMessage(handle, WM_GETTEXTLENGTH, IntPtr.Zero, null);
     
                // Init the string builder to hold the text.
                var sb = new StringBuilder(length + 1);
     
                // Writes the text from the handle into the StringBuilder
                SendMessage(handle, WM_GETTEXT, (IntPtr)sb.Capacity, sb);
     
                // Return the text as a string.
                return sb.ToString();
            }
     
            public delegate bool Win32Callback(IntPtr hwnd, IntPtr lParam);
     
            [DllImport("user32.Dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool EnumChildWindows(IntPtr parentHandle, Win32Callback callback, IntPtr lParam);
     
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            static public extern IntPtr GetClassName(IntPtr hWnd, System.Text.StringBuilder lpClassName, int nMaxCount);
     
            private static bool EnumWindow(IntPtr handle, IntPtr pointer)
            {
                GCHandle gch = GCHandle.FromIntPtr(pointer);
                List<IntPtr> list = gch.Target as List<IntPtr>;
                if (list == null)
                    throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>");
                list.Add(handle);
                return true;
            }
     
            public List<IntPtr> GetChildWindows(IntPtr parent)
            {
                List<IntPtr> result = new List<IntPtr>();
                GCHandle listHandle = GCHandle.Alloc(result);
                try
                {
                    Win32Callback childProc = new Win32Callback(EnumWindow);
                    EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
                }
                finally
                {
                    if (listHandle.IsAllocated)
                        listHandle.Free();
                }
                return result;
            }
        }
     
     
     
        /// <summary>Contains functionality to get all the open windows.</summary>
        public static class OpenWindowGetter
        {
            [DllImport("USER32.DLL")]
            static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam);
     
            [DllImport("USER32.DLL")]
            static extern int GetWindowText(HWND hWnd, StringBuilder lpString, int nMaxCount);
     
            [DllImport("USER32.DLL")]
            static extern int GetWindowTextLength(HWND hWnd);
     
            [DllImport("USER32.DLL")]
            static extern bool IsWindowVisible(HWND hWnd);
     
            [DllImport("USER32.DLL")]
            static extern IntPtr GetShellWindow();
     
     
            /// <summary>Returns a dictionary that contains the handle and title of all the open windows.</summary>
            /// <returns>A dictionary that contains the handle and title of all the open windows.</returns>
            public static IDictionary<HWND, string> GetOpenWindows()
            {
                HWND shellWindow = GetShellWindow();
                Dictionary<HWND, string> windows = new Dictionary<HWND, string>();
     
                EnumWindows(delegate(HWND hWnd, int lParam)
                {
                    if (hWnd == shellWindow) return true;
                    if (!IsWindowVisible(hWnd)) return true;
     
                    int length = GetWindowTextLength(hWnd);
                    if (length == 0) return true;
     
                    StringBuilder builder = new StringBuilder(length);
                    GetWindowText(hWnd, builder, length + 1);
     
                    windows[hWnd] = builder.ToString();
                    return true;
     
                }, 0);
     
                return windows;
            }
     
            delegate bool EnumWindowsProc(HWND hWnd, int lParam);
     
     
        }
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  10. #10
    Membre à l'essai
    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
    Points : 10
    Points
    10
    Par défaut
    Merci pour ce code.
    en fait tu es parti sur la 1ere idée que j'ai eu, du fait que la fenêtre qui contient les informations est une pop-up (donc une fenêtre fille). Mais en fait on peut la récupérer directement avec le "FindWindow( null,"Track Information - RailScan");" ou dans la liste "OpenWindowGetter.GetOpenWindows();".

    J'ai donc ignorer les lignes de 45 à 61. en sortant le bloc de lignes 56-59 directement en dessous du if ligne 42
    donc je liste toute les fenêtres, trouve la pop-up qui m'interesse, et là j'essaye avec ce que tu m'as donnée de récupérer le contenu de la fenêtre, mais je n'arrive à obtenir que le titre de cette dernière.
    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
     
    foreach (KeyValuePair<IntPtr, string> window in OpenWindowGetter.GetOpenWindows())
    {
        IntPtr handle = window.Key;
        string title = window.Value;
     
        if (title.Contains("Track information - RailScan"))
        {
            int length = GetWindowTextLength(handle);
            StringBuilder builder = new StringBuilder(length);
            GetWindowText(handle, builder, length + 1);
            string result = builder.ToString();
            Trace.WriteLine(result);
        }
    }
    j'ai essayé de chercher sur pinvoke.net pour voir si il y a une fonction qui me permettrais de récupérer la liste des contrôles dans une fenêtre. et ensuite je n'aurais qu'a récuperer le texte de ce contrôle, mais là je trouve pas

    En tout cas un grand merci pour ce que vous m'avez apporté tout les deux, ça m'as bien aidé

  11. #11
    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
    Points : 5 195
    Points
    5 195
    Par défaut
    C'est la fonction "GetchildWindows" qui permet de récupérer TOUS les controles de la fenetre dont tu passes le hwnd.

    Après, si un controle se trouve dans un "groupBox" par exemple, il faut essayer de faire celà de façon récursive.

    Je pense qu'avec le code que je t'ai donné, tu as TOUS les outils puisque tu peux, avec ce code:


    - Récupérer le Handle d'une fenetre
    - Récupérer les controles d'une fenetre dont tu connais le Handle
    - Récupérer le texte (GetText() ) d'un controle dont tu as le handle (récupérer dans GetchildWindows)...
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  12. #12
    Membre à l'essai
    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
    Points : 10
    Points
    10
    Par défaut ENFIN !
    Bonjour,
    Ça y est j'ai enfin terminé ce que je voulais faire.
    Avec la fenêtre "Track information" je ne pouvais pas récupérer les contrôles (ou handle) fils...je ne sais toujours pas pourquoi. Alors la méthode la plus longue à portée ses fruits :
    - récupération de toute les fenêtres fille en partant de GetDesktopWindow()
    - parcours de tous les Handles jusqu'à trouver celui qui nous intéresse, grâce à une expression régulière.
    - ajout d'un Timer , activé et avec une période de 100ms
    - affichage sur label pour suivre l'évolution de la valeur

    Maintenant que j'ai récupérer cette info je vais pouvoir continuer mon travail.

    Pour les futures personnes qui arrivent ici et qui ont eu le même souci, voici le code avec lequel ça fonctionne (chez moi) :
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
     
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);
            #region import
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowProc lpEnumFunc, IntPtr lParam);
     
            [DllImport("user32.dll", SetLastError = false)]
            static extern IntPtr GetDesktopWindow();
     
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
     
            [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            static extern int GetWindowTextLength(IntPtr hWnd);
     
            [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
     
            [DllImport("user32.dll", SetLastError = true)]
            static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
     
            [DllImport("user32.dll", SetLastError = true)]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
            #endregion
     
            public Form1()
            {
                InitializeComponent();
            }
     
            public static List<IntPtr> GetChildWindows(IntPtr parent)
            {
                List<IntPtr> result = new List<IntPtr>();
                GCHandle listHandle = GCHandle.Alloc(result);
                try
                {
                    EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
                    EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
                }
                finally
                {
                    if (listHandle.IsAllocated)
                        listHandle.Free();
                }
                return result;
            }
     
            private static bool EnumWindow(IntPtr handle, IntPtr pointer)
            {
                GCHandle gch = GCHandle.FromIntPtr(pointer);
                List<IntPtr> list = gch.Target as List<IntPtr>;
                if (list == null)
                {
                    throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>");
                }
                list.Add(handle);
                //  You can modify this to check to see if you want to cancel the operation, then return a null here
                return true;
            }
     
            public static string GetText(IntPtr hWnd)
            {
                // Allocate correct string length first
                int length = GetWindowTextLength(hWnd);
                StringBuilder sb = new StringBuilder(length + 1);
                GetWindowText(hWnd, sb, sb.Capacity);
                return sb.ToString();
            }
     
            public static string GetClassName(IntPtr hWnd)
            {
                StringBuilder className = new StringBuilder(100);
                //Get the window class name
                GetClassName(hWnd, className, className.Capacity);
     
                return className.ToString();
            }
     
            public static Process GetProcess(IntPtr hWnd)
            {
                int processId = 0;
                GetWindowThreadProcessId(hWnd, out processId);
                return Process.GetProcessById(processId);
            }
     
            private void Timer()
            {
                DateTime dt_start = DateTime.Now;
                List<IntPtr> wndList = GetChildWindows(GetDesktopWindow());
                //IntPtr hWnd = FindWindow(null, "Track Information - RailScan");
                //List<IntPtr> wndList = GetChildWindows(hWnd);
                string sPattern = "^: \\d{2}:\\d{2}:\\d{2},\\d{6}";
     
                foreach (IntPtr item in wndList)
                {//pour  chaque item de la liste
                    string s = GetText(item);   //on récup le texte
                    if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern))
                    {//si ca correspond a l'expression régulière
                        //listebox1.Add( "Process : " + GetProcess(item) + "\thWnd: " + item.ToString() + "\tClass : " + GetClass(item) + "\tText: " + GetText( item) );
                        label1.Text = "\t\tTime: " + s; //+ "\tTime : " + (DateTime.Now - dt_start).ToString()
                        this.Refresh();
                        break;  //on sort de la boucle
                    }
                }
            }
     
            private void timer1_Tick(object sender, EventArgs e)
            {
                Timer();
            }
        }
    }
    Merci pour votre aide. Je passe donc le sujet en résolu.WindowsFormsApplication2.zip
    @+

+ 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