begin process at 2010 02 10 13:29:05
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > MASQUER EFFICACEMENT LA CONSOLE !

MASQUER EFFICACEMENT LA CONSOLE !


 Information sur la source

 Description

J'ai longtemps chercher comment masquer efficacement la console de mon appli car elle sert à rien (un serveur, donc pas besoin de console).
De plus, déselectionner la construction d'une console dans dev-C++ n'est pas très efficace. En effet une fenetre apparait et disparait qd on lance une commande au serveur :(

Source

  • #include <windows.h>
  • HANDLE hConsole;
  • HWND GetConsoleHwnd(void)
  • {
  • #define MY_BUFSIZE 1024 // Buffer size for console window titles.
  • HWND hwndFound; // This is what is returned to the caller.
  • char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated
  • // WindowTitle.
  • char pszOldWindowTitle[MY_BUFSIZE]; // Contains original
  • // WindowTitle.
  • // Fetch current window title.
  • GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
  • // Format a "unique" NewWindowTitle.
  • wsprintf(pszNewWindowTitle,"%d/%d",
  • GetTickCount(),
  • GetCurrentProcessId());
  • // Change current window title.
  • SetConsoleTitle(pszNewWindowTitle);
  • // Ensure window title has been updated.
  • Sleep(40);
  • // Look for NewWindowTitle.
  • hwndFound=FindWindow(NULL, pszNewWindowTitle);
  • // Restore original window title.
  • SetConsoleTitle(pszOldWindowTitle);
  • return(hwndFound);
  • }
  • int main(){
  • hConsole = GetConsoleHwnd();
  • ShowWindow(hConsole, SW_HIDE);
  • /* appli */
  • return 0;
  • }
#include <windows.h>

HANDLE hConsole;

HWND GetConsoleHwnd(void)
{
       #define MY_BUFSIZE 1024 // Buffer size for console window titles.
       HWND hwndFound;         // This is what is returned to the caller.
       char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated
                                           // WindowTitle.
       char pszOldWindowTitle[MY_BUFSIZE]; // Contains original
                                           // WindowTitle.
       // Fetch current window title.
       GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
       // Format a "unique" NewWindowTitle.
       wsprintf(pszNewWindowTitle,"%d/%d",
                   GetTickCount(),
                   GetCurrentProcessId());
       // Change current window title.
       SetConsoleTitle(pszNewWindowTitle);
       // Ensure window title has been updated.
       Sleep(40);
       // Look for NewWindowTitle.
       hwndFound=FindWindow(NULL, pszNewWindowTitle);
       // Restore original window title.
       SetConsoleTitle(pszOldWindowTitle);
       return(hwndFound);
}

int main(){
    hConsole = GetConsoleHwnd();
    ShowWindow(hConsole, SW_HIDE);
/* appli */
    return 0;
} 

 Conclusion

J'ai trouvée la fonction GetConsoleHwnd() dans MSDN, très efficace :)


 Sources du même auteur

Source avec Zip Source avec une capture HASH MD5 D'UNE CHAINE OU D'UN FICHIER (DE TAILLE QUELCONQUES...
LES NOMBRES PREMIERS (CRIBLE D'ERATHOSTÈNE)
TRI D'ENTIER DANS L'ORDRE CROISSANT (TRISHELL)
IMPLÉMENTATION D'UNE PILE D'ENTIER
CONVERSION BINAIRE <> DECIMALE EFFICACE

 Sources de la même categorie

SMART POINTEUR À COMPTEUR DE RÉFÉRENCE par nirgal76
POINTEUR INTELLIGENT par snpier wolf
ALIGNER TEXTE CONSOLE par CptPingu
QWERTY - AZERTY AVEC SDL, UNE ALTERNATIVE par Scheb
Source avec Zip Source avec une capture INSERER UNE ANIMATION FLASH (WIN32-DEVCPP) par gagah1

Commentaires et avis

Commentaire de djl le 13/05/2004 21:22:47

si tu ve une appli sans fenetre, pourquoi tu fait pas une appli win32 sans créer de fenetre?

Commentaire de kod32 le 13/05/2004 21:25:39

parcequ'avec Dev-C++, j'ai exactement le meme prob qd je lance une commande au serveur : une fenetre console s'ouvre et se ferme. J'avais besoin d'un code explicite...

Commentaire de djl le 13/05/2004 21:30:44

ok

Commentaire de Steph115 le 23/07/2004 15:15:20

Salut je suis sur visual C++ 6.0 et quand je compile j'obtient ceci :
error C2664: 'ShowWindow' : cannot convert parameter 1 from 'void *' to 'struct HWND__ *'
        Conversion from 'void*' to pointer to non-'void' requires an explicit cast

Merci de repondre si vous savez comment l'enlever.

Commentaire de DarkBoss le 17/08/2004 19:54:05

Il faut simplement que tu remplace :

ShowWindow(hConsole, SW_HIDE);

par:

ShowWindow((HWND)hConsole, SW_HIDE);

et voila ca marche now !

Commentaire de Steph115 le 18/08/2004 00:34:07

Merci de ton aide

@++

Commentaire de Choumoumou le 27/04/2006 23:21:56

Génial !
Ça m'aide énormément !
Merci pour cette source !
@+ !

Commentaire de Melnofil le 05/06/2006 02:05:29

Copier les bidouilles des mecs de chez Micro$oft c le mal !

Utilisez plutôt la fonction FreeConsole();
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/setconsoletitle.asp

Ps : kod32 tu t'es gourré dans ton code, la variable "hConsole" doit être déclarée du type HWND au lieu de HANDLE et il n'est pas nécessaire de la déclarer en globale.

Commentaire de Melnofil le 05/06/2006 02:07:41

oups pas le bon lien =>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/freeconsole.asp

Bonne chance++

Commentaire de TamateaRaust le 13/07/2006 13:45:32

Ce code est vraiment pratique.
Hélas une fois que la fenêtre est caché, il n'y a plus aucun moyen d'y accéder. Serait-il possible d'avoir une icone dans le systray pour afficher ou cacher la console DOS ?
Quelqu'un pourrait-il m'indiquer les modifications à apporter pour que cela soit possible ?

Commentaire de Melnofil le 20/07/2006 04:47:53

TamateaRaust : As-tu tenté un "ShowWindow(hConsole, SW_SHOW);" ? (je ne pense pas :-p)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/Windowing/Windows/WindowReference/WindowFunctions/ShowWindow.asp
Pratique certes mais c'est de la bidouille !

Déjà cette fonction est-elle bien nécessaire ?
- Soit votre programme est fait pour être lancé en mode console qui reste ouverte dans ce cas le problème ne se pose pas.
- Soit votre programme est en pur fenetré, dans ce cas là utilisez plutôt un projet Windows au lieu de DOS et il n'y aura pas de console.
- Soit votre programme est un hybride par exemple un programme en tâche de fond ou pour que le code source soit compilable avec linux/mac... seuls des cas particuliers de ce genre justifiront cette guerre contre la console.

Si vous voulez vraiment pouvoir manipuler librement une console (style pour la passer en traybar sans bidouillages ou tout simplement la rendre moins moche), il est plus souple (et pas vraiment plus compliqué) de la construire directement vous-même comme beaucoups de logiciel commerciaux le font.

L'interêt principal de l'appel à FreeConsole() dans les programmes DOS est de rendre votre application non-modale http://fr.wikipedia.org/wiki/Fen%C3%AAtre_modale . Un programme lancé en DOS bloque la session DOS tant que FreeConsole() n'est pas appelé. Après tout si votre programme n'est pas fait pour être lancé en ligne de commande vous devriez être en train d'écrire un programme Windows et non DOS.

Si vous préférez garder la console de base mais passer en non-modale, appelez successivement FreeConsole() et AllocConsole() au début du main() pour détacher le processus de la console appelante et en créer une nouvelle spécialement dédiée à cette application.

Si vous êtes joueur, sachez qu'on est cencé pouvoir faire ce qu'on veux des flux standards (les trucs qui défilent sur la console justement) par exemple à l'aide de "SetStdHandle" ( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/setstdhandle.asp ), voir meme encore plus bourrin avec une redéfinition de macros du style :
#ifdef stderr
#undef stderr
#endif
#define stderr (...)
/* N'oubliez pas de toujours fermer les flux dans un bloc finally ou dans un destructeur d'objet */

Voilà j'espère avoir convaincu quelques personnes de ne pas utiliser GetConsoleHwnd() et d'avoir donné assez de pistes pour l'éviter plus proprement ;-)

Commentaire de tularis le 10/05/2008 12:18:55

Toujours autant a la masse ce bon vieux melnofil ^^
Merci pour la source, même si c'est du recopier c'est toujours simpa de le mettre a dispos sur des site français ...,
Personnellement j'utilise un programme qui utilise fenetre et console, ce code m'est donc très utile ... j'aprecie l'economie de travail que tu ma fourni ...
En tous cas Melnofil je n'aurai jamais du faire de généralité sur les développeur de codes sources, en effet il y a beaucoup de code baclé ou meme pas finis, mais il y a aussi d'excellent développeur, inspire toi d'eux ... t'en a besoin ...
comme brunews par exemple ...

Commentaire de Melnofil le 13/05/2008 13:19:10

"il y a aussi d'excellent développeur (...) comme brunews par exemple ..." <== Chercherais-tu à t'attirer les bonnes grâces de tes Dieux en leur léchant les pieds ? =^.^=

Bon trêve de plaisanterie, parlons plus sérieusement :
Imagine que ton ordinateur soit en train d'effectuer un lourd traitement dans un autre programme, la fonction GetConsoleHwnd() ci-dessus n'est pas unaire comme un write() donc la main peu très bien être rendue au système entre les deux appels à SetConsoleTitle(), ce qui fait que l'utilisateur voit passer le titre temporaire de la console. Même si le temps d'affichage bizarre n'est de l'ordre que d'un dixième de seconde, ce n'est pas le genre de truc que l'utilisateur lambda souhaite voir >_<

Ps 1 : Tularis étant donné que tu m'a l'air adepte des "techniques" de programmation Microsoft je te conseil de passer au framework .NET comme ça tu n'auras plus a utiliser ces vieilles "techniques" dans tes applications... (En tout cas pas celle mentionnée ci-dessus)

Ps 2 : Va expliquer à un g33k sous Linux que ton programme va lui masquer sa console customisée faite avec amour au démarrage, sans lui demander son avis. Un programme bien fait laisse l'ordinateur dans l'état où il l'a trouvé quand il se referme.

Commentaire de tularis le 13/05/2008 18:49:02

-_-, bon ok pour l'optimisation, mai bon l'utilisateur lambda i sen fou tant que sa marche ..., ensuite perso si je voulais faire un logiciel de clé usb jen ferai un en winapi, c'est plu simple , le truc c que la je fonction sou linux et que mon logiciel est un logiciel de sécurité par utilisateur, tu configure l'appli et op tu lance les traitements, tu cache la fenêtre.
Dernière chose , le respect et le lechbotisme sont deux choses différente, en programmation le respect c'est quelque chose que tu aperçois par une façon de programmer et une patience a aider ce qui ne comprenne pas, le lechbotisme , c'est flater par interet, hors moi jai simplement fai la remarque que tu devrai avoir plus de modestie quand tu conseil car tu n'est qu'un petit programmeur ...
derniere chose, je programme deja en .NET et c'est un langage magnifique, simplement parfois on a besoin doptimisation des traitement ...

Kan meme a ton age traiter les gens de leche bot ... sa releve de la mentalité de primaire ... surtout que lécher les botte sur un forum, faut vraiment etre seul ... ne me rabaisse pas a ton niveau .

Commentaire de Melnofil le 23/05/2008 12:01:02

"tu devrais avoir plus de modestie quand tu conseil" <== Ouaip, faudrait.
"car tu n'est qu'un petit programmeur" <== Ça c'est ton point de vu basé sur on se demande quoi, mais bizarrement les gens que je connais/j'ai connu IRL ont plutôt tendance à dire le contraire...

Tes deux derniers commentaires n'apportent rien à la source ci-dessus ainsi que le mien actuellement, on sort complètement du débat. Je crois que je vais arrêter les frais en ne surveillant plus cette source : Ergoter sur des trucs vieux de 2 ans c'est marrant 1 ou 2 fois...

De toutes façon, j'ai déjà expliqué en long en large et en travers pourquoi la solution proposée par Microsoft me semble nulle ; de ton coté tu n'as avancé aucun argument pour soutenir ton point de vue. Après tu fais ce que tu veux Tularis, j'oblige personne et c'est toujours bien d'avoir des choix, au cas où ça peux toujours servir un jour... À tchao ++

Commentaire de chtitpierre78 le 02/12/2008 13:04:09

Merci, c'est exactement ca qu'il me fallait :)

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,576 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales