Bonjour,

Je développe des applis graphiques mais j'aimerais pouvoir aussi les utiliser en mode console. Plus exactement je voudrais que lorsque on lance l'appli avec un switch depuis une console, le programme retourne une valeur comme peut le faire la commande DIR ou TIME en msdos.

Je développe avec MinGw et Qt et je ne connais rien en API windows (il y a une semaine que j'ai découvers les handle, hwin etc....)

J'y suis presque, voilà comment je m'y prends :

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
//En-tête pour Qt
#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QDebug>

#if (_WIN32_WINNT < 0x0500) // This switch is needed to make the program compile
#undef _WIN32_WINNT        // because AttachConsole needs it. See Documentation
#define _WIN32_WINNT 0x0501 // for AttachConsole in MSDN.
#endif

#include <windows.h>
#include <cstdio>
#include <iostream>

HANDLE hOutput;

int consoleCnx(void)
    {
    static LPCTSTR ConsoleClassName = TEXT( "ConsoleWindowClass" );
    static LPCTSTR ConsoleTitle = TEXT( "Invite de commandes" );

    // trouver la fenêtre console à partir du titre donné
    HWND hConsoleWnd = ::FindWindow(
        ConsoleClassName,
        ConsoleTitle );

    if(hConsoleWnd == NULL) return 1;

    // récupérer le processus associé à cette fenêtre
    DWORD pid;
    if (!::GetWindowThreadProcessId(hConsoleWnd,&pid)) return 2;

    // s'attacher à la console de ce processus
    if(!::AttachConsole(pid)) return 3;

    // si une console est rattachée au processus, alors il existe des fichiers
    // virtuel CONIN$ et CONOUT$ qui permettent respectivement de lire
    // et d'écrire depuis / dans cette console (voir la doc de CreateFile).
#if _MSC_VER >= 1400 // VC++ 8
    // éviter le warning C4996: 'freopen' was declared deprecated
    // This function or variable may be unsafe. Consider using freopen_s instead.
    FILE *stream;
    freopen_s( &stream, "CONIN$", "r", stdin );
    freopen_s( &stream, "CONOUT$", "w", stdout );
    freopen_s( &stream, "CONOUT$", "w", stderr );
#else
    std::freopen( "CONIN$", "r", stdin );
    std::freopen( "CONOUT$", "w", stdout );
    std::freopen( "CONOUT$", "w", stderr );
#endif

    // la ligne suivante synchronise les flux standards C++ (cin, cout, cerr...)
    std::ios_base::sync_with_stdio();

    // récupérer un handle sur la sortie console
    hOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOutput == INVALID_HANDLE_VALUE){
        ::FreeConsole();
        return 4;
        }

    return 0;
    }

int main(int argc, char* argv[])
    {
    #ifndef DEBUG
    consoleCnx();
    #endif

    if (argc > 1)
        if (QString(argv[1]) == QString("-v")){

            std::cout << "cout \n";

            DWORD *wrote = 0;
            WriteFile(hOutput,"WriteFile \n",11,wrote,NULL);

            unsigned long ulWritten;
            WriteConsole(hOutput,TEXT("WriteConsole \n"),14,&ulWritten,NULL);

            return 0;
            }

    //Code Qt pour afficher un bouton
    QApplication app(argc, argv);

    QPushButton quit("Quit");
    quit.resize(75, 30);
    quit.setFont(QFont("Times", 18, QFont::Bold));
    QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));
    quit.show();

    return app.exec();
    }
Seulement voilà ce que ce code retourne exactement:

*********
c:\repertoire>winConsole.exe -v

c:\repertoire>cout
WriteFile
WriteConsole

***********

En plus, il faut que je tape entrée pour récupérer la main. D'autre part, si je fais :

c:\repertoire>winConsole.exe -v > test.txt

Le fichier test.txt est vide

Ce n'est pas le fonctionnement des commandes classiques comme par exemple TIME /T
Le résultat est affiché sous le prompt, je récupère automatiquement la main et je peux rediriger la sortie vers un fichier texte.

Un autre problème de mon code, c'est que j'utilise le nom de la fenêtre de la console "Invite de commande" mais ce n'est pas très propre, surtout qu'on a des machines en français et en anglais et il peut y avoir d'autre consoles d'ouvertes en même temps. Est ce qu'on peut récupérer le HWND ou le pid de la fenetre appelante?

Je veux faire ça car je dépose sur un disque réseau les programmes que je développe et les utilisateurs les récupères depuis différentes machines. Seulement ils n'ont pas toujours le réflexe de vérifier les mises à jour et je voudrais faire un script qui compare la version du programme locale avec celle du disque réseau et qui download automatiquement la dernière version si nécessaire.

Voilà j'espère que je ne vous ai pas trop saoulé mais je ne vois plus trop quoi faire malgré ce lien :

http://www.developpez.net/forums/d85...-infos-stdout/