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 :

Texte d'une application console


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    Par défaut Texte d'une application console
    Bonjour,

    Je suis dans un programme windows et j'amerais lire le contenu d'une fenetre de commande Dos (cmd.exe). NB: J'ai le handle de la fenetre.
    Le message WM_GETTEXT me renvoie le nom de la fenetre et nom le texte contenu dans la fenetre.

    Attention : Mon application n'est pas une application console mais une fiche par exemple. L'application console a été demarrer par l'utilisateur à l'aide de la commande cmd.exe.

    Avez-vous une idée?


    L'utilitaire Wintask (www.wintask.com) le fait avec la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Capture$("CMD.EXE|ConsoleWindowClass|Invite de commandes", 1, 0)
    le problème c'est que je ne sais pas comment.


    Merci d'avance.

  2. #2
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Je ne connais pas wintask. Il lance la console, ou récupère le texte de n'importe quelle console déjà ouverte ?
    Pour ton problème, c'est toi qui lances la consoles (cmd.exe) suite à une demande de l'utilisateur ? Ou bien c'est déjà lancé à côté ? (comment tu récupères le handle alors ?)
    Ca doit fonctionner sous quel OS ? Parce que à partir de XP j'ai une ou deux idées, masi avant, ca va se compliquer...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    Par défaut
    En faite, j'ai une application console qui est déjà lancé avant que mon executable se lance.

    J'ai un procédure que j'ai faite pour récuperer le Hanlde de la fenetre en fonction de sa classe, de son process et de son titre.

    J'ai donc le handle de ma fenetre INvite de commande.

    Si je fais SendMessage(Handle, WM_GETTEXT, size, Text) je récupère le titre de la fenetre de commande et non son contenu.

    Ce qui m'interesse c'est son contenu.

    J'espère que j'ai été clair. Merci d'avance pour toute réponse.

  4. #4
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    J'ai une solution plutôt propre à partir de XP. Ton programme ne doit pas posséder de console:
    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
    typedef std&#58;&#58;basic_string<TCHAR> stringT;
    
    bool GetConsoleTextFromOutputHandle&#40; HANDLE hConsoleOut, stringT & Result &#41;
    &#123;
        // déterminer la taille du buffer pour stocker le texte
        CONSOLE_SCREEN_BUFFER_INFO screen_info;
        if &#40; !GetConsoleScreenBufferInfo&#40;
            hConsoleOut,
            &screen_info &#41; &#41;
        &#123;
            return false;
        &#125;
        
        // allouer un buffer de 64 Ko
        const DWORD buffer_size = 64 * 1024 / sizeof&#40; TCHAR &#41;;
        TCHAR buffer&#91; buffer_size &#93;;
    
        // déterminer le nombre de caractères à lire
        DWORD nb_wanted = screen_info.dwSize.X * screen_info.dwSize.Y;
        
        if &#40; nb_wanted > buffer_size &#41; // ne devrait jamais se produire...
        &#123;
            nb_wanted = buffer_size;
        &#125;
    
        // récupérer le texte
        COORD read_coord = &#123; 0, 0 &#125;;
        DWORD nb_read;
        if &#40; !ReadConsoleOutputCharacter&#40;
            hConsoleOut,
            buffer,
            nb_wanted,
            read_coord,
            &nb_read &#41; &#41;
        &#123;
            return false;
        &#125;
    
        // déterminer la fin réelle du texte en recherchant le dernier
        // caractère qui ne soit pas un espace
        LPTSTR buffer_end = &buffer&#91; nb_read - 1 &#93;;
        while &#40; buffer_end&#91; -1 &#93; == TEXT&#40; ' ' &#41; &&
                buffer_end > buffer &#41;
        &#123;
            --buffer_end;
        &#125;
        size_t text_length = buffer_end - buffer;
    
        // déterminer le nombre de lignes que cela fait
        size_t line_width = screen_info.dwSize.X;
        size_t nb_lines = &#40; text_length + line_width - 1 &#41; / line_width;
    
        // prendre en compte les '\n' insérés pour l'allocation
        Result.clear&#40;&#41;;
        Result.reserve&#40; &#40; line_width + 1 &#41; * nb_lines &#41;;
    
        // parcourir chacune de ces lignes
        for &#40; size_t i = 0; i < nb_lines; ++i &#41;
        &#123;
            TCHAR * begin = buffer + i * line_width;
            TCHAR * end = begin + line_width;
            // trouver la fin réelle de la ligne
            while &#40; end&#91; -1 &#93; == TEXT&#40; ' ' &#41; &&
                    end > begin &#41;
            &#123;
                --end;
            &#125;
            // ajouter cette ligne au résultat
            Result.append&#40; begin, end &#41;;
            // ajouter un saut de ligne si ce n'est pas la dernière
            if &#40; i != nb_lines - 1 &#41;
            &#123;
                Result += TEXT&#40; '\n' &#41;;
            &#125;
        &#125;
        return true;
    &#125;
    
    bool GetConsoleTextFromTitle&#40; LPCTSTR ConsoleTitle, stringT & Result &#41;
    &#123;
        static LPCTSTR ConsoleClassName = TEXT&#40; "ConsoleWindowClass" &#41;;
        // trouver la fenêtre console à partir du titre donné
        HWND hConsoleWnd = &#58;&#58;FindWindow&#40;
            ConsoleClassName,
            ConsoleTitle &#41;;
        if &#40; hConsoleWnd == NULL &#41;
        &#123;
            return false;
        &#125;
        // récupérer le processus associé à cette fenêtre
        DWORD pid;
        if &#40; !&#58;&#58;GetWindowThreadProcessId&#40; hConsoleWnd, &pid &#41; &#41;
        &#123;
            return false;
        &#125;
        // s'attacher à la console de ce processus
        if &#40; !&#58;&#58;AttachConsole&#40; pid &#41; &#41;
        &#123;
            return false;
        &#125;
        // récupérer un handle sur la sortie console
        HANDLE hOutput = &#58;&#58;GetStdHandle&#40; STD_OUTPUT_HANDLE &#41;;
        if &#40; hOutput == INVALID_HANDLE_VALUE &#41;
        &#123;
            &#58;&#58;FreeConsole&#40;&#41;;
            return false;
        &#125;
        // récupérer le texte de cette sortie
        bool res = GetConsoleTextFromOutputHandle&#40; hOutput, Result &#41;;
        // se détacher de la console
        &#58;&#58;FreeConsole&#40;&#41;;
        // fin
        return res;
    &#125;

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    Par défaut
    Merci pour cette réponse. Dommage qu'elle ne fonctionne que sous Windows XP et 2003.

    Je vais la tester et je vous tiens au courant.

    J'ai un peu de boulot, il faut que je la traduise en Pascal (Delphi 7).

    Qd çà sera fait et fonctionnel, je la metterai sur le site ...

    Mickael

Discussions similaires

  1. Echange de texte avec une application console
    Par Roland Chastain dans le forum Pascal
    Réponses: 10
    Dernier message: 22/09/2013, 23h46
  2. Réponses: 4
    Dernier message: 25/04/2005, 19h36
  3. Comment retrouver le handle d'une application console?
    Par Laurent Dardenne dans le forum Windows
    Réponses: 7
    Dernier message: 22/12/2004, 16h58
  4. Créer une application console
    Par darinze dans le forum Langage
    Réponses: 7
    Dernier message: 18/06/2004, 17h35
  5. [Kylix] une application console
    Par naili dans le forum EDI
    Réponses: 3
    Dernier message: 19/04/2004, 14h27

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