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 :

[c# 2.0]Nombre d'instances (et/ou attributs) des navigateurs web


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut [c# 2.0]Nombre d'instances (et/ou attributs) des navigateurs web
    Bonjour,

    je voudrais gérer les navigateurs web sur un système.
    j'utilise ce code pour récupérer le nombre d'instances (par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.Diagnostics.Process[] prc = System.Diagnostics.Process.GetProcessesByName("iexplore");
    int nbInstances = prc.Length;
    quand c'est internet explorer, le nombre est bon, mais quand je teste avec firefox, il me renvoie toujours "1". J'ai regardé dans le gestionnaire des taches, même si j'ouvre 4 fenetres de firefox, il n'y a qu'un processus firefox.exe (le système est sur XP embedded).

    Par ailleurs, je voudrais utiliser la classe WebBrowser.
    Comment récupérer une instance d'un navigateur, l'assigner à un objet WebBrowser pour ensuite recherche l'instance d'un quelconque navigateur et changer son URL ?
    pour l'URL, il existe la méthode Navigate()... c'est celle que j'utilise mais j'ai un problème pour récupérer le numéro de l'instance...


    Merci beaucoup.
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Citation Envoyé par slim Voir le message
    Bonjour,

    je voudrais gérer les navigateurs web sur un système.
    j'utilise ce code pour récupérer le nombre d'instances (par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.Diagnostics.Process[] prc = System.Diagnostics.Process.GetProcessesByName("iexplore");
    int nbInstances = prc.Length;
    quand c'est internet explorer, le nombre est bon, mais quand je teste avec firefox, il me renvoie toujours "1". J'ai regardé dans le gestionnaire des taches, même si j'ouvre 4 fenetres de firefox, il n'y a qu'un processus firefox.exe (le système est sur XP embedded).

    Par ailleurs, je voudrais utiliser la classe WebBrowser.
    Comment récupérer une instance d'un navigateur, l'assigner à un objet WebBrowser pour ensuite recherche l'instance d'un quelconque navigateur et changer son URL ?
    pour l'URL, il existe la méthode Navigate()... c'est celle que j'utilise mais j'ai un problème pour récupérer le numéro de l'instance...


    Merci beaucoup.
    Ben, je peux pas vous donner du code comme ça, car il y a un peu plus de boulot que prévu, mais je peux vous donner au moins le principe / l'algo, si c'est important pour vous de d'enumerer les navigateurs par le nombre de fenetres ouvertes qui leur appartiennent et qui "surfent" effectivement sur le web ; vous butez en effet sur une difference d'implementation entre IE et Firefox relative a la maniere dont ils gerent leurs fenetres de "surfent" :

    (je fais l'hypothese qu'on s'interesse a un navigateur particulier, connu a l'avance, disons donc Firefox, qui vous pose probleme)

    0) votre compteur = 0 (très facile)

    1) recup de l'instance du process (facile également, vous l'avez deja fait )

    2) (en option, voir [ EDIT ] ci-dessous) sur l'instance, recup du handle natif windows : propriete Handle

    3) ensuite, via .NET P/Invoke et l'API Win32 EnumWindow, enumerez toutes les fenetres ouvertes de la station Windows ; cela necessitera probablement une fonction recursive vers les fenetres enfants ... ( ? )

    4) lors de l'etape (3), filtrez les fenetres qui vous interessent, c-a-d, entre autres criteres(?), celles qui appartiennent au process obtenu en (1) / (2) ; pour cela utilisez a nouveau P/Invoke avec l'API GetWindowModuleFileName => alors, si c'est un nom comme "...\firefox.exe" c'est un candidat pour incrementer votre compteur

    http://www.pinvoke.net/default.aspx/...umWindows.html

    http://www.pinvoke.net/default.aspx/...eFileName.html

    [ EDIT ]

    Le handle obtenu en (2) vous permettra d'implementer un filtre en (3) et (4) encore plus sûr : avec encore une autre API, GetWindowThreadProcessId, et System.Diagnostics.Process.GetProcessById vous pourrez verifier que le handle de fenetre enumérée avec EnumWindow a appartient bien au bon process (via le process id et System.Diagnostic.Process.MainModule.FileName, a comparer avec le chemin retourné par GetWindowModuleFileName)

    Pour ce qui est de votre deuxieme question, je la soupçonne un peu plus difficile a traiter...

    'HTH

  3. #3
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    Salut,

    Merci pour la réponse...

    mais j'ai toujours un problème.
    j'ai créé une classe Window qui me récupère la liste de toutes les fenetres ouvertes en utilisant pinvoke (fonctions de l'API win32 : user32.dll).

    voici le 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
    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
            public Collection<Navigateur> IdentifierNavigateursOuverts()
            {
                try
                {
                    List<Window> listWindows = new List<Window>();
                    Window window = new Window(new IntPtr(), "");
                    int compteur = 0;
                    listWindows = window.GetWindowsList();
                    string[] nomsNav;
                    nomsNav = param.GetNomsNavigateurs();
                    Process[] processes = System.Diagnostics.Process.GetProcesses();
                    foreach (Process proc in processes)
                    {
                        foreach (Window wdw in listWindows)
                        {
                            foreach (string nomNav in nomsNav)
                            {
                                if (proc.MainWindowTitle.Contains(nomNav) && wdw.Name == proc.MainWindowTitle)
                                {
                                    Navigateur navigateur = new Navigateur();
                                    compteur = GetNombreInstancesNavAPartirDeNomNav(nomNav);
                                    if (compteur == 0)
                                    {
                                        navigateur.EtatNavigateur = (int)Navigateur.EnumEtatNavigateur.modeFerme;
                                    }
                                    else if (compteur == 1)
                                    {
                                        navigateur.EtatNavigateur = (int)Navigateur.EnumEtatNavigateur.modeOuvertUneInstance;
                                    }
                                    else if (compteur > 1)
                                    {
                                        navigateur.EtatNavigateur = (int)Navigateur.EnumEtatNavigateur.modeOuvertPlusieursInstances;
                                    }
                                    else
                                    {
                                        navigateur.EtatNavigateur = (int)Navigateur.EnumEtatNavigateur.modeInconnu;
                                    }
                                    navigateur.HWND = wdw.HWND;
                                    //nav.TitreFenetreNavigateur = wdw.Name;
                                    navigateur.IdProcessus = proc.Id;
                                    navigateur.NomNavigateur = proc.MainModule.FileVersionInfo.FileDescription;
                                    navigateur.NomProcessus = proc.ProcessName;
                                    navigateur.PathNavigateur = proc.MainModule.FileName;
                                    if (wdw.Name == proc.MainWindowTitle)
                                    {
                                        navigateur.TitreFenetreNavigateur = wdw.Name;
                                    }
                                    navigateur.VersionNavigateur = proc.MainModule.FileVersionInfo.ProductVersion;
                                    this.ListeNavigateursOuverts.Add(navigateur);
                                }
                            }
                        }
                    }
                }
    Quand par exemple une fenetre fille internet explorer est ouverte, elle n'est pas considérée comme un processus ouvert. Elle ne s'affiche dans la liste des processus ouverts dans le gestionnaire de programmes.
    Du coup, je la recupère avec pinvoke mais pas avec GetProcesses().

    Je suis obligé d'utiliser les méthodes de System.Diagnostics.Process car elles me servent à récupérer la version, l'id etc du processus.

    Voila, merci
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Hmm.. Ok, vous avez quand même bien avancé.

    Je jette un oeil à ça moi même et reviens vers vous asap.

    C'est pas immédiat (ou bien j'ai loupé une solution plus simple...) mais on ne doit plus être très loin.

    A bientôt.

  5. #5
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    J'ai apporté quelques (légères) modifications à ma fonction :
    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
            public Collection<Navigateur> IdentifierNavigateursOuverts()
            {
                try
                {
                    Window window = new Window(new IntPtr(), "");
                    List<Window> listWindows = window.GetWindowsList();
                    List<IntPtr> listHandles = new List<IntPtr>();
                    int compteur = 0;
                    string[] nomsNav = param.GetNomsNavigateurs();
                    Process[] processes = System.Diagnostics.Process.GetProcesses();
                    foreach (Process proc in processes)
                    {
                        foreach (string nomNav in nomsNav)
                        {
                            string nomProcess = param.GetNomProcessAPartirDeNomNav(nomNav);
                            if (proc.ProcessName == nomProcess)
                            {
                                foreach (Window wdw in listWindows)
                                {
                                    if (proc.MainWindowHandle == wdw.HWND && !listHandles.Contains(wdw.HWND))
                                    {
                                        Navigateur navigateur = new Navigateur();
                                        compteur = GetNombreInstancesNavAPartirDeNomNav(nomNav);
                                        if (compteur == 0)
                                        {
                                            navigateur.EtatNavigateur = (int)Navigateur.EnumEtatNavigateur.modeFerme;
                                        }
                                        else if (compteur == 1)
                                        {
                                            navigateur.EtatNavigateur = (int)Navigateur.EnumEtatNavigateur.modeOuvertUneInstance;
                                        }
                                        else if (compteur > 1)
                                        {
                                            navigateur.EtatNavigateur = (int)Navigateur.EnumEtatNavigateur.modeOuvertPlusieursInstances;
                                        }
                                        else
                                        {
                                            navigateur.EtatNavigateur = (int)Navigateur.EnumEtatNavigateur.modeInconnu;
                                        }
                                        navigateur.HWND = wdw.HWND;
                                        listHandles.Add(navigateur.HWND);
                                        navigateur.TitreFenetreNavigateur = wdw.Name;
                                        navigateur.IdProcessus = proc.Id;
                                        navigateur.NomNavigateur = proc.MainModule.FileVersionInfo.FileDescription;
                                        navigateur.NomProcessus = proc.ProcessName;
                                        navigateur.PathNavigateur = proc.MainModule.FileName;
                                        navigateur.VersionNavigateur = proc.MainModule.FileVersionInfo.ProductVersion;
                                        //navigateur.UrlNavigateur = proc.she
                                        this.ListeNavigateursOuverts.Add(navigateur);
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    //this.traceur.Trace(e.Message, e.
                    Console.WriteLine("Erreur d'identification des navigateurs ouverts \n. {0} Source : {1}", e.Message, e.Source);
                }
                return this.ListeNavigateursOuverts;
            }
    Ces modifications ne changent en rien le traitement et j'ai toujours le même problème.
    Merci.
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  6. #6
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    Des nouvelles

    j'arrive à récupérer l'URL de internet explorer en relevant le contenu de combobox32.
    Je travaille sur un système embarqué (windows embedded), et il faut que je gère intégralement la navigation sur internet (il n'y a qu'un seul site autorisé).

    Pour modifier l'url, je récupère le handle du combox donc, je mets un SETTEXT dans une fonction SendMessage. L'url est bien changée mais le site ne se charge pas.
    Dans l'application de test que j'ai créé, j'ai l'url de départ qui est www.google.fr. En la changeant en www.developpez.net, la page ne se rafraichit pas. Par contre, la barre d'adresse contient bien www.developpez.net.

    J'ai essayé les fonctions suivantes :
    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
                            NativeMethods.SendMessage(handleTemp, WM_SETTEXT, str.Capacity, str);
                            NativeMethods.SendMessage(wdw.HWND, WM_KEYDOWN, (int)VK_RETURN, 0);
                            NativeMethods.SendMessage(wdw.HWND, WM_KEYUP, (int)VK_RETURN, 0);
     
                            NativeMethods.SendMessage(handleTemp, WM_KEYDOWN, (int)VK_RETURN, 0);
                            NativeMethods.SendMessage(handleTemp, WM_KEYUP, (int)VK_RETURN, 0);
                            //NativeMethods.SendMessage(handleTemp, WM_KEYDOWN, VK_RETURN, 0);
                            //WM_SETREDRAW ne marche pas
                            //NativeMethods.SendMessage(handleTemp, WM_SETREDRAW, 0, 0);
     
     
                            //NativeMethods.SendMessage(wdw.HWND, WM_COMMAND, (int)0x40, 0);
     
     
     
                            NativeMethods.PostMessage(wdw.HWND, WM_KEYDOWN, (int)VK_RETURN, 0);
                            NativeMethods.PostMessage(wdw.HWND, WM_KEYUP, (int)VK_RETURN, 0);
                            NativeMethods.PostMessage(handleTemp, WM_KEYDOWN, (int)VK_RETURN, 0);
                            NativeMethods.PostMessage(handleTemp, WM_KEYUP, (int)VK_RETURN, 0);
                            //NativeMethods.PostMessage(wdw.HWND, WM_KEYUP, (int)Keys.Enter, 0);
    Mais ca ne marche pas.
    Quelqu'un aurait une idée de comment faire ?
    Merci beaucoup.
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

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

Discussions similaires

  1. Détecter le nombre d'instances d'un programme.
    Par defluc dans le forum Langage
    Réponses: 3
    Dernier message: 26/03/2010, 18h31
  2. Réponses: 5
    Dernier message: 27/11/2009, 09h21
  3. Compter le nombre d'instance d'une classe
    Par cashmoney dans le forum Langage
    Réponses: 2
    Dernier message: 21/09/2009, 11h31
  4. Compter le nombre d'instance d'une classe
    Par themadmax dans le forum C#
    Réponses: 6
    Dernier message: 12/07/2008, 09h48
  5. nombre d'instance pour une base
    Par awatif dans le forum Oracle
    Réponses: 2
    Dernier message: 08/08/2007, 19h16

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