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 :

Application en ligne de commande & Systray


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut Application en ligne de commande & Systray
    Bonjour, j'espère que quelques personnes pourront m'aider à résoudre mon problème. J'ai développé une programme en C qui fonctionne dans une fenêtre DOS. Ce dernier tourne en continu dans l'attente de requête.

    Pour la suite de mon développement, on m'a demandé à ce que la fenêtre DOS soit caché mais reste malgré tout accessible à partir d'une icone qui serait dans la barre des tache (systray près de l'horloge).

    Mes connaissances étant assez limité en programmation à partir d'API de windows, je n'ai pu que chercher des exemples et essayer de les adapter sans obtenir de résultats bien concret.

    Je souhaiterais donc savoir si une personne pourrait me fournir un exemple de code permettant d'appeler mon programme au démarrage et ensuite de cacher / montrer la fenêtre DOS.
    A défaut d'exemple si vous avez un tutorial ou tout autre guide pouvant m'aider, je vous en serait reconnaissant.

    Merci.
    Au revoir.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Pour faire une icône dans le systray avec l'API Windows, il faut une fenêtre (visible ou non)...

    Et utiliser la fonction Shell_NotifyIcon().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Merci pour cette réponse mais je n'arrive à rien de concret.
    Quelqu'un aurait-il un exemple simple a utiliser. Il suffirait juste d'afficher / cacher une console DOS en cliquant sur une icone dans la barre des taches.

    Les seules choses que j'ai réussi à faire pour l'instant, c'est de ne pas afficher la console du tout (peu pratique car on ne sait pas si elle est lancé de manière simple).

    Aidez moi s'il vous plait .

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Pour commencer, as-tu créé une fenêtre (visible ou invisible) pour pouvoir y associer une icône dans la barre des tâches ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    J'ai une fenêtre DOS qui effectue des taches.
    C'est un agent qui attend qu'on lui envoie des requêtes et donc ne fait rien de spécial tant qu'il ne reçoit aucune message.

    En parallèle, j'ai trouvé ceci :
    trayicon

    Ce code est vraiment bien et j'arrive à le compiler.
    Ce qu'il faudrait c'est que je réussisse à appeler mon main() que je renommerais principal() par exemple pour ne pas avoir de problème. Je vais essayer de déclarer le prototype et appeler la fonction à divers endroit pour voir ce que cela donne.

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    J'ai réussis à adapter mon code pour faire ce que je souhaitais (mettre mon programme en icone dans le systray).

    Hélas, il y a de très grande différence entre l'affichage d'information dans une console DOS et l'affichage dans une fenêtre Win32.

    J'ai lu de nombreux tuto mais aucun ne présente de manière concrète comme faire de l'affichage de message (quelles fonctions appeler, ou les appeler ...).

    Est ce que quelqu'un aurait une solution de rechange pour remplacer des printf() par des TextOut() ? Je n'arrive qu'à afficher un mot (et encore) ... A la base mon programme recevait une instruction, réalisait certaine tâches et affichait un message du style :

    printf (" Etat d'eConf : \n");
    printf (" ============== \n");
    printf (" -- ETAT \n");

    Bref un affichage qui s'adaptait bien au mode console avec du texte qui défilait. Comment avoir un affichage de mes messages avec un application Win32 ?

  7. #7
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Sur une fenêtre, oui avec TextOut.

    Mais alors il faut gérer la longueur du texte, le bas de la fenêtre, etc.

    Donc places plutôt un EditBox sur la fenêtre qui agira comme une console.
    L'itération est humaine; la récursion, divine.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    2 options:
    1. DrawText(), plus avancé que TextOut().
    2. Fenêtre contenant une EditBox. C'est ce que je te conseillerais, car tu n'aurais pas à en gérer l'affichage. Pour y ajouter du texte, la méthode classique, c'est d'y envoyer (avec la SendMessage()) le message EM_SETSEL pour régler la "sélection" tout à la fin de l'editbox, puis le message EM_REPLACESEL pour ajouter le texte. Tu peux te faire "assez facilement" une fonction qui fait ça d'un coup, s'il n'y en a pas déjà une dans la FAQ (site et forum)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    J'ai vu DrawText() dans un exemple mais il y avait l'argument [ LPRECT lpRect ] dont je n'ai pas vraiment compris comment le récupérer ou l'initialiser.

    De plus, je ne sais pas si l'on peut placer un TextOut() ou DrawText() n'importe ou dans le code ou seulement dans la fonction qui gère les messages :

    LRESULT CALLBACK MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

    De même, j'ai beau chercher des tuto, pas bcp d'explication sur SendMessage() :
    http://chgi.developpez.com/windows/
    http://bob.developpez.com/tutapiwin/

    Enfin merci de vos réponse, j'essayerais de bien regarder çà demain mais la trop chaud

    PS : juste pour etre sur, un fenetre DOS ne peut pas etre mise en icone dans le systray ? Je n'ai jamais réussi parce que le systray a besoin d'un programe Win32 commençant par int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) alors que la console DOS d'un simple main().

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Si un programme est Win32 console et non pas DOS, il peut tout à fait créer une fenêtre (il suffit de connaître la bonne fonction pour récupérer le HINSTANCE de l'exécutable) et lui associer une icône dans le systray.

    Par contre, pour cacher la console, ce n'est pas facile, car selon la version de Windows, elle n'appartient pas forcément au processus courant (pas plus qu'un XTerm n'appartient aux programmes qu'il contient).
    Enfin, tu peux toujours récupérer le Handle de la fenêtre console (GetConsoleWindow() à partir de Win2000, ou un truc zarb à base de SetConsoleTitle(), Sleep() et FindWindow() avant) et tenter de lui envoyer un message WM_SHOWWINDOW pour la cacher...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Quoique, tu peux créer une console avec AllocConsole.

    Edit:

    Il faut réassigner stdin, stdout et stderr:

    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
    #include <windows.h>
    #include <stdio.h>
    
    BOOL APIENTRY WinMain( HINSTANCE, HINSTANCE, char*, int )
    {
    	if ( !AllocConsole() )
    		return 1;
    
    	freopen( "CON", "r", stdin );
    	freopen( "CON", "w", stdout );
    	freopen( "CON", "w", stderr );
    
    	printf( "TEST\n" );
    
    	while(1);
    
    	return 0;
    }
    Et ca fonctionne très bien.
    L'itération est humaine; la récursion, divine.

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Mais là, la console, on l'a déjà. Le problème, c'est pour la cacher.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Citation Envoyé par Médinoc
    Mais là, la console, on l'a déjà. Le problème, c'est pour la cacher.
    A part ShowWindow( GetConsoleWindow(), SW_HIDE ), je ne vois pas.
    L'itération est humaine; la récursion, divine.

  14. #14
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    J'avais fait un programme avec un AllocConsole() mais impossible alors d'attraper le message de fermeture de la fenêtre dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    avec
    La fenêtre se fermait alors ainsi que tout le programme et impossible de le cacher dans la barre du systray.

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je sais.
    Et sous un Windows Non-NT, le SetConsoleCtrlHandler() est incapable d'attrapper l'événement CTRL_CLOSE_EVENT.
    Je sais, j'avais essayé.

    Depuis, je me suis fait ma propre fenêtre qui reproduisait l'affichage d'une console, mais bien évidemment, on ne pouvait pas y écrire avec des pipes...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    zut

    Et sinon une idée si je peux remplacer tout mes printf() de mon code pour afficher du texte dans la fenêtre win32 de manière simple ?
    Je dois remplacer mes printf() par des TextOut() dans tout le code ou bien ou on ne peut appeler les TextOut() que dans :

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Comme on l'a déjà dit, ce sera plus facile si tu utilises une EditBox dans ta fenêtre.
    Tu n'auras pas à t'occuper de WM_PAINT ni de TextOut(), il te suffira juste de changer (ou ajouter) le texte de l'editbox...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    ok je vais chercher tout çà alors et je vous tiens au courant ... merci ^^

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/12/2009, 14h31
  2. Réponses: 3
    Dernier message: 27/11/2007, 23h05
  3. Réponses: 2
    Dernier message: 21/05/2006, 10h30
  4. [C#] Application avec lignes de commande
    Par Oberown dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/10/2005, 18h26

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