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 :

Récupérer le HWND du Desktop visible


Sujet :

Windows

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut Récupérer le HWND du Desktop visible
    Bonjour,

    Commençons par situer le contexte...
    J'ai écrit un petit programme de capture d'écran (que j'appellerai "sc.exe").
    Il est possible de le lancer en spécifiant un délai d'attente avant que la capture ne soit faite. Donc, si je lance "sc.exe -d 5000", le programme attend 5 secondes puis fait la capture.
    Pour capturer le contenu de l'écran, je commence par récupérer un handle sur la fenêtre correspondant au bureau (GetDesktopWindow()) puis je procède de façon classique (GetDC()+CreateCompatibleDC()+CreateCompatibleBitmap()...etc...).

    Problème...
    Si je lance "sc.exe -d 5000" puis appuie aussitôt sur Ctrl+Alt+Suppr et attends 10 secondes avant de cliquer sur "Annuler", je passe du bureau "WinSta0\Default" au bureau "WinSta0\Winlogon" et après retour à "WinSta0\Default" je constate que ma capture est "vide" (image noire), et ce même si mon programme est lancé en tant qu'utilisateur "SYSTEM".

    Recherche de solution...
    J'ai modifié mon programme pour en produire deux autres : "scEnum.exe" et "scInput.exe".
    "scEnum.exe"
    Le but de "scEnum.exe" était de vérifier que je pouvais capturer le contenu du bureau "Winlogon" (et savoir si c'était bien lui qui était visible). Son principe est le suivant : utilisation EnumWindowStations(), appel (dans le callback) à SetProcessWindowStation() pour rattacher le processus à la station énumérée puis utilisation de EnumDesktops(), appel de SetThreadDesktop() (dans le callback de EnumDesktop() bien sûr) pour rattacher le thread au desktop voulu et, enfin, capture du contenu du desktop courant via la méthode utilisée dans précédemment (dans "sc.exe").
    Si "scEnum.exe" est lancé avec les droits "SYSTEM", j'obtiens N captures et l'une d'elle contient bien le bureau "Winlogon" si il est visible au moment de la capture.
    Mais : j'ai N captures (dont N-1 vides) alors que je n'en veux qu'une.
    "scInput.exe"
    Le but de "scInput.exe" était de vérifier si OpenInputDesktop() me permettrait de trouver *LE* bureau actuellement visible.
    En effet, lorsqu'il est visible, je peux interagir avec lui (cliquer sur "Verrouiller", "Annuler") et MSDN nous dit :
    Citation Envoyé par MSDN
    The OpenInputDesktop function opens the desktop that receives user input.
    Mais c'est apparemment faux (ou alors je n'ai pas la même définition de "user input") puisque "scInput.exe" ne capture qu'une image "vide" (en tant que "SYSTEM" : en tant qu'administrateur OpenInputDesktop() échoue et getLastError() renvoie 2).
    Autrement dit, OpenInputDesktop() semble toujours renvoyer le HDESK de "WinSta0\Default" même si le bureau avec lequel j'interagis est "WinSta0\Winlogon".

    Question
    Comment savoir (de façon certaine) quel est le bureau actuellement visible (éventuellement pour une WindowStation donnée) ?

    Merci d'avance pour votre aide (et votre compréhension si je me suis mal exprimé : c'est mon premier "post").

    Notes :
    1) j'ai essayé, dans "scEnum.exe", de vérifier les valeurs renvoyées par IsWindowVisible() et IsWindowEnabled() (en leur passant le HWND du desktop courant), mais plusieurs bureaux (enfin : leur fenêtre) sont visibles et activés en même temps.
    2) pour régler le problème des permissions (obligation de lancer le programme en tant que "SYSTEM"), je pensais créer un service qui se chargerait de la capture, le programme ne servant plus qu'à démarrer/arrêter/communiquer avec ce service. Voyez-vous d'autres options (propres) ?

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    C'est très pointu comme question ça :-)
    Normalement OpenInputDesktop() te renvoie bien le desktop visible à l'écran. Je pense que c'est plutôt un problème de privilèges.
    Il doit falloir ajuster les privilèges. Etre admin te donne le droit de le faire, mais par défaut tu ne dois pas avoir les privilèges nécessaires. Par contre tu as le droit de les modifier.
    Comment manipules-tu le HDESK retourné par OpenInputDesktop() afin d'obtenir une capture ?
    Quelques liens:
    http://www.codeguru.com/Cpp/misc/misc/system/article.php/c3749
    http://www.codeproject.com/system/RunUser.asp (voir "6.1. Start a Program in a logon Screen").

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    C'est très pointu comme question ça :-)
    Ca pique ?
    Citation Envoyé par Aurelien.Regat-Barrel
    Normalement OpenInputDesktop() te renvoie bien le desktop visible à l'écran.
    Plus de détails demain avec du code (long) et des exemples concrets (des vraies valeurs de HDESK et tout et tout)...Le problème sera peut-être plus compréhensible (c'est bien le C la langue maternelle des membres du forum ?).
    Citation Envoyé par Aurelien.Regat-Barrel
    Je pense que c'est plutôt un problème de privilèges.
    Il doit falloir ajuster les privilèges. Etre admin te donne le droit de le faire, mais par défaut tu ne dois pas avoir les privilèges nécessaires. Par contre tu as le droit de les modifier.
    Vu que j'ai fait la plupart de mes tests en laçant mes programmes en tant qu'utilisateur SYSTEM, je ne me suis pas trop posé la question des privilèges. Mais surtout, ce n'est pas le problème : j'arrive à capturer l'image du desktop visible à coup sûr si je capture les image de tous les desktops. Le problème c'est qu'au lieu d'avoir à faire N (>1) captures, je veux n'en faire qu'une : la bonne.
    Citation Envoyé par Aurelien.Regat-Barrel
    Comment manipules-tu le HDESK retourné par OpenInputDesktop() afin d'obtenir une capture ?
    Comme expliqué dans mon message précédent. A partir d'un HDESK, j'appelle SetThreadDesktop() pour assigner ce DT au thread courant, puis j'appelle GetDesktopWindow() pour obtenir un HWND, puis GetDC() pour obtenir un DC à partir du HWND, etc, etc... Le détail du code demain.
    Citation Envoyé par Aurelien.Regat-Barrel
    Quelques liens:
    http://www.codeguru.com/Cpp/misc/misc/system/article.php/c3749
    http://www.codeproject.com/system/RunUser.asp (voir "6.1. Start a Program in a logon Screen").
    J'y reviendrai aussi (je connaissais déjà mais merci quand même).

    Bref, demain : près de 300 lignes de code + des fichiers de log créés par le programme dont je donnerai le code...et des questions : soyez prêts.

  4. #4
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    Boujour David,
    Je serais interreser par ton code qu'on devait voir

    Est-ce visible ?

    Cordialement

Discussions similaires

  1. Script pour récupérer le HWND d'une fenêtre Windows
    Par Alcofribas Nasier dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 26/06/2009, 15h01
  2. ActiveX: Récupérer un HWND valide avant le 1er affichage
    Par ShevchenKik dans le forum Windows
    Réponses: 2
    Dernier message: 27/05/2008, 16h50
  3. Récupérer le hWnd
    Par Nico28 dans le forum MFC
    Réponses: 2
    Dernier message: 22/03/2007, 11h48
  4. Récupérer le hwnd d'une fenetre lancé avec shellexecute sans les API?
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 06/09/2006, 19h48
  5. récupérer le texte d'un tooltip grace à son hwnd
    Par ChrisitianS_ dans le forum MFC
    Réponses: 2
    Dernier message: 19/11/2005, 15h23

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