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

VB.NET Discussion :

Connaitre le processus d'une appli Modern UI ouverte sur le bureau


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Mars 2011
    Messages : 105
    Points : 153
    Points
    153
    Par défaut Connaitre le processus d'une appli Modern UI ouverte sur le bureau
    Bonjour,

    Je développe un soft permettant de "piloter" au moyen d'une télécommande diverses applications multimédia.
    Ce pilotage est fait à la façon d'un être humain (envoi de raccourcis claviers, clics souris simulés..).
    Pour ça j'ai besoin de connaître divers choses (id du programme, handle de fenêtre..).
    Il n'y a pas de problème avec les applications classique, mais je voudrais utiliser aussi certaine applications Modern UI (celles pouvant tourner sur le bureau), notemment Netflix.
    Pour le lancement, j'utilise la class process et le lien "netflix:///". Le processus est bien lancé, mais je n'ai pas d'id de processus en retour.
    Je me suis aperçu que c'est l'application "ApplicationFrameHost" qui gère le processus. En récupérant son id, je peux "piloter" l'application netflix.

    Ma question est donc : comment récupérer l'id du processus après lancement de l'application au moyen du lien ?

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Mars 2011
    Messages : 105
    Points : 153
    Points
    153
    Par défaut
    up up ...
    Personne n'a d'idées ? (ou plutôt de connaissances)

    J'ai lancé deux applis Modern UI (Netflix et Edge) sur le bureau (donc dans deux fenêtres, et non en plein écran). Si, dans le gestionnaire des tâches, je supprime le processus "ApplicationFrameHost", les *deux* applis sont tuées et supprimées de la mémoire. ???

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Ce n'est pas vraiment recommande. Les applications pour W8/W10 sont concues pour suivre un cycle de vie bien precis, et il est regule par Windows.

    Plus d'info ici : App lifecycle.

    Les applications ecrites en HTML/JavaScript tournent en principe au sein d'un process "WWAHost.exe". Le seul moyen de savoir lequel killer est de connaitre son PID... Sinon, les apps ecrites en C#/C++ tournent dans leur propre process qui est en principe identifiable grace au nom de l'exe.

    Mais encore une fois, il vaut mieux eviter de tuer les apps Modern UI...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Mars 2011
    Messages : 105
    Points : 153
    Points
    153
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Les applications ecrites en HTML/JavaScript tournent en principe au sein d'un process "WWAHost.exe". Le seul moyen de savoir lequel killer est de connaitre son PID... Sinon, les apps ecrites en C#/C++ tournent dans leur propre process qui est en principe identifiable grace au nom de l'exe.

    Mais encore une fois, il vaut mieux eviter de tuer les apps Modern UI...
    Merci de ta réponse.
    Mon but n'est pas de tuer les applis modern UI (uniquement celles tournant sur le bureau), mais d'avoir un certain contrôle sur la fenêtre de ces applis.
    Je veux pouvoir appliquer à ces fenêtres les mêmes commandes qu'aux fenêtres des applis classiques. (Set/GetForegroundWindow, Set/GetWindowPlacement etc...).
    Donc j'ai effectivement besoin de connaître l'id du processus lancé (c'était ma question de départ).
    Par exemple si je lance Microsoft Edge, je peux connaître le handle de fenêtre et appliquer mes commandes en recherchant l'id du processus.... "ApplicationFrameHost".
    Idem en lançant netflix: c'est aussi en recherchant l'id de "ApplicationFrameHost" que je peux commander cette appli...

    Je lance ces applis au moyen de la class process en donnant l'URL de l'appli (netflix:, microsoft-edge: ). En retour l'id du processus vaut 0.
    D'où ma question : comment obtenir l'id du processus lancé ?

  5. #5
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Pas sur, mais si tu lances l'application en utilisant Process.Start, tu peux recuperer le PID comme suit :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim process = New Process()
    process.StartInfo.FileName = "tonprocess.exe"
    process.Start()
     
    Console.WriteLine("PID: " & process.Id)
    Sinon, si la fenetre du process s'ouvre en tant que fenetre principale, tu dois aussi pouvoir le recuperer en utilisant Process.MainWindowHandle. A noter, cette propriete peut etre vide pendant un certain temps, donc il faut parfois boucler dessus et eventuellement faire quelques sleep en attendant que la valeur arrive...

    A tester car je n'ai jamais teste cela avec des apps W8/W10...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Mars 2011
    Messages : 105
    Points : 153
    Points
    153
    Par défaut
    Bon, après divers essais, la class process et une appli modern UI ne sont pas fait l'un pour l'autre

    Si je défini Firefox comme navigateur par défaut et que j'exécute ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
           Try
                Dim mprocess As New Process
                mprocess.StartInfo.FileName = "url"      ' url est une adresse internet
                mprocess.StartInfo.UseShellExecute = True
                mprocess.Start()
                idprg = mprocess.Id
                appli=mprocess.ProcessName
            Catch ex As Exception
                 MessageBox.Show(ex.ToString)
            End Try
    cela fonctionne bien :
    - ouverture du navigateur sur le site voulu dans url
    - idprg contient l'id du processus et appli son nom (firefox)
    idem avec d'autres navigateurs (IE, opera..)

    Si, par contre, je défini Microsoft Edge (appli modern UI) comme navigateur par défaut:
    - ouverture du navigateur sur le site voulu dans url (ça c'est bon)
    - affichage d'un message d'erreur : "System.InvalidOperationException: Aucun processus n'est associé à cet objet." (à la ligne idprg=mprocess.Id)

    En attendant d'en savoir plus, je vais bricoler un truc dans le catch pour savoir si le processus "ApplicationFrameHost" a été lancé et, si c'est le cas, récupérer son id (ok c'est pas terrible )

    Edit: Je corrige: ça fonctionne bien avec firefox, chrome ou opera mais pas avec Internet explorer (pareil qu'avec edge).

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Mars 2011
    Messages : 105
    Points : 153
    Points
    153
    Par défaut
    Pour tester la raison d'être de "ApplicationFrameHost" j'ai écrit 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
    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
     
    Public Class Form1
        Dim hdle_mui As New List(Of String)
        Dim title_mui As New List(Of String)
        Public Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As IntPtr, ByRef lpRect As Rectangle) As Boolean
     
        'démarrer ou arrêter la surveillance
        Private Sub BT_start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_start.Click
            If Timer_fen_mui.Enabled Then
                Timer_fen_mui.Stop()
                BT_start.Text = "Démarre surveillance"
            Else
                Timer_fen_mui.Start()
                BT_start.Text = "Arrête surveillance"
            End If
        End Sub
     
        'surveillance des applications Modern UI sur le bureau
        Private Sub Timer_fen_mui_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer_fen_mui.Tick
            Dim p() As Process = Process.GetProcessesByName("ApplicationFrameHost")
            If p.Length > 0 Then
                Dim hdle As String = p(0).MainWindowHandle.ToString
                Dim title As String = p(0).MainWindowTitle
                If hdle <> "0" Then
                    If hdle_mui.Count > 0 Then
                        If Not hdle_mui.Contains(hdle) Then
                            hdle_mui.Add(hdle)
                            title_mui.Add(title)
                            LB_result.Items.Add("Nouveau Handle ajouté: " & hdle & " : " & title)
                        End If
                    Else
                        hdle_mui.Add(hdle)
                        title_mui.Add(title)
                        LB_result.Items.Add("Nouveau Handle ajouté: " & hdle & " : " & title)
                    End If
                End If
            End If
     
     
            Dim rect As New Rectangle
            For n = hdle_mui.Count - 1 To 0 Step -1
                If GetWindowRect(Convert.ToInt64(hdle_mui(n)), rect) = False Then
                    LB_result.Items.Add("handle supprimé: " & hdle_mui(n) & " : " & title_mui(n))
                    hdle_mui.RemoveAt(n)
                    title_mui.RemoveAt(n)
                End If
            Next
        End Sub
     
        'tuer le processus ApplicationFrameHost si lancé
        Private Sub BT_kill_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_kill.Click
            Dim p() As Process = Process.GetProcessesByName("ApplicationFrameHost")
            If p.Length > 0 Then
                p(0).Kill()
            End If
        End Sub
     
        'nettoyer la listbox
        Private Sub BT_clear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_clear.Click
            LB_result.Items.Clear()
            For n = 0 To hdle_mui.Count - 1
                LB_result.Items.Add("handle mémorisé: " & hdle_mui(n) & " : " & title_mui(n))
            Next
        End Sub
     
        'fermeture
        Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            Timer_fen_mui.Stop()
        End Sub
     
        'ouverture : lancer le timer de surveillance
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Timer_fen_mui.Start()
        End Sub
    End Class
    Une fenêtre : Form1
    3 boutons : BT_start, BT_kill, BT_clear
    une listbox : LB_result
    un timer : Timer_fen_mui

    Le programme .exe pour tester:

    test_mui_bureau.rar

    Lancer le programme puis ouvrir depuis le bureau des applis Modern UI (météo, edge, calendrier ...)
    tester la fermeture d'une application
    tester la suppression de "ApplicationFrameHost"

Discussions similaires

  1. [XL-MAC 2011] Creer une macro, créer un double sur le bureau/ copier/coller/reporter/déduire et supprimer
    Par Arnaud. dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 29/07/2014, 17h28
  2. Réponses: 0
    Dernier message: 31/03/2011, 13h37
  3. Créer une appli iphone qui pioche sur un SQL
    Par lacfab dans le forum Autres
    Réponses: 0
    Dernier message: 18/08/2010, 10h41
  4. [Linq to Sql] Passage d'une appli web utilisant Linq sur serveur
    Par cereal59 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 02/11/2008, 13h15
  5. comment connaitre la memoire utilisée par une appli?
    Par afrikha dans le forum Autres Logiciels
    Réponses: 11
    Dernier message: 19/11/2005, 21h24

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