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 Discussion :

Problème avec EnumChildWindows à partir d'un service sur Windows Seven


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 48
    Points
    48
    Par défaut Problème avec EnumChildWindows à partir d'un service sur Windows Seven
    Bonjour à tous !

    J'ai un souci qui me fait perdre la raison et commence à me rendre dingue, c'est pourquoi je fait appel à vous, les experts, pour me sauver la vie (d'accord, peut-être que j'exagère un peu...).

    Voici le contexte (lecture optionnelle):
    j'ai créé un service Windows qui doit lancer un sous-programme dont le but est de télécharger un EXE et de le lancer. Dans le cas de mon test, l'EXE téléchargé est un Setup d'application avec une IHM.

    Mon problème initial concernait la fenêtre du Setup lancé avec un "CreateProcessAsUser" (avec le token pour s'afficher sur le bureau...je vous passe les détails) : cette fenêtre apparait sous toutes les autres fenêtres ouvertes.

    Du coup, je me dis "pas de problème, on peut changer l'ordre d'affichage avec un SetForegroundWindow" et tout et tout". Mon soucis est que j'ai besoin du HWND de la fenêtre du Setup lancé pour pouvoir la passer au-dessus des autres.

    Ok, à priori, je peux trouver le HWND à partir du PID du Setup en utilisant une combinaison de "EnumWindows" et "EnumChildWindows".

    Voici le problème:
    Je ne trouve pas le HWND de mon Setup lancé depuis l'application qui tourne dans System. Cela vient du fait que mon processus system ne voit que les HWND qui sont "autour" de lui, et que les autres se trouvant dans l'espace "user" sont inaccessibles depuis là.

    Voici la(les) question(s):
    Comment pourrais-je accéder à l'ensemble des HWND (de toutes les sessions, etc.) comme le fait l'explorateur des tâches de Windows ?

    Ou bien, comment mettre mon processus appelant dans l'espace "desktop" du user courant ?





    Mes questions sont-elles sensées ou bien suis-je complètement à la rue ? :p


    Merci d'avance pour votre lecture et vos réponses.

    @+

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 72
    Points : 77
    Points
    77
    Par défaut
    Hello,
    As-tu essayé avec la fonction GetGUIThreadInfo() ?

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    Vous devez faire l'EnumWindows dans la bonne "Window Stations"
    http://msdn.microsoft.com/en-us/libr...98(VS.85).aspx

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    J'ai tenté sans succès d'utiliser la fonction GetGUIThreadInfo() avec le ThreadId rendu lors du CreateProcessAsUser mais cela n'a pas fonctionné, hélas. Sinon, j'aurais pu me passer de parcourir toutes les fenêtres ouvertes à la recherche de celle correspondant à mon PID de processus lancé. Merci quand même pour l'idée

    Comme le dit "bacelar", il est clair que je ne suis pas dans le bon contexte d'exécution. Ce qui paraît logique car mon application qui lance et recherche le "sous-programme" se trouve associée au système (car lancée depuis un service Windows)...

    Je vais tenter deux choses :
    1/ lancer mon "launcher" directement dans le bon contexte pour qu'il soit attribué à l'utilisateur courant au lieu du système.
    2/ changer le "windows station" en utilisant les fonctions "EnumWindowStations" et "SetProcessWindowStation".

    Si quelqu'un sait comment exécuter une application dans le contexte de l'utilisateur courant complet (y compris clé HKEY_CURRENT_USER en base de registre), ça m'intéresse A priori, c'est déjà ce qu'est sensé faire le CreateProcessAsUser mais je dois faire plusieurs tests pour confirmer ça.

  5. #5
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    Ajouter un programme intermédiaire, s'exécutant dans l'espace User, ne serait-il pas une solution simple ?

    Le service lancerait ce programme en utilisant CreateProcessAsUser, et c'est ce programme qui téléchargerait et lancerait le Setup voulu.

    Et comme ce programme tournerait dans l'espace User, il n'aurait aucun problème pour obtenir le handle de la fenêtre du Setup.

    Quand à ce programme intermédiaire, il n'a nul besoin d'avoir lui-même une fenêtre et il serait invisible de l'utilisateur ...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par Prof Voir le message
    Bonjour.

    Ajouter un programme intermédiaire, s'exécutant dans l'espace User, ne serait-il pas une solution simple ?

    Le service lancerait ce programme en utilisant CreateProcessAsUser, et c'est ce programme qui téléchargerait et lancerait le Setup voulu.

    Et comme ce programme tournerait dans l'espace User, il n'aurait aucun problème pour obtenir le handle de la fenêtre du Setup.

    Quand à ce programme intermédiaire, il n'a nul besoin d'avoir lui-même une fenêtre et il serait invisible de l'utilisateur ...
    C'est exactement ce que j'ai fait en tentant la solution 1/ que j'avais décrite hier, et le résultat est plutôt satisfaisant car :
    1/ mon setup se lance bien dans la session de l'utilisateur
    2/ la fenêtre du setup se positionne bien au-dessus des autres sans même effectuer d'appel a une fonction du système pour le faire.

    Le seul soucis restant est que le prompt UAC ne se fait pas directement sur le bureau...seul le bouclier clignotant s'affiche dans la barre des tâches. C'est assez moyen surtout que si je ne cache pas la fenêtre du "launcher" alors ce prompt apparaît normalement.

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/11/2007, 10h25
  2. [Excel] La fonction wraptext et bordure
    Par maxeur dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 19/04/2007, 10h58
  3. problème avec un rollover (effet de survol) sur une image/bouton
    Par f56bre dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 19/03/2007, 15h10
  4. Problème avec Barre de lancement, et icones sur le bureau
    Par FredericB dans le forum Windows XP
    Réponses: 10
    Dernier message: 16/02/2007, 00h39

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