C ++ Windows: Comment fermer une fenêtre de console?

J’ai une fenêtre de console ouverte en utilisant AllocConsole (), en plus de la fenêtre principale de Win32. La fenêtre de la console s’ouvre avant la fenêtre principale.

Lorsque je ferme la fenêtre principale et que le programme revient de la fonction principale, la console rest ouverte (tout comme le processus). Il se bloque quelque part dans ntdll, comme le montre le débogueur lors de la mise en pause du programme à partir de Visual Studio 2012.

En le fermant en cliquant sur le bouton X, vous quittez le processus, mais ne le fermez pas avec FreeConsole (), le processus continue de fonctionner sans fenêtre. CloseWindow (GetConsoleWindow ()) ne le ferme pas, il le minimise (!?!). PostMessage (GetConsoleWindow (), WM_QUIT, 0,0) ferme la fenêtre mais le processus continue de fonctionner (visuellement, cela est identique à FreeConsole ()).

Parfois, le programme se ferme correctement, mais cliquer sur le bouton X fonctionne à chaque fois.

Comment faire la même chose en cliquant sur le bouton X?

Utilisez PostMessage(wnd, WM_CLOSE, 0, 0) pour fermer la fenêtre de la console, mais le problème est probablement ailleurs dans votre programme même si cela fonctionne comme un correctif. La fenêtre de la console devrait se fermer / disparaître automatiquement lorsque vous revenez de votre main() ou WinMain() .

Vous devez détruire la console dans le message FreeConsole utilisant FreeConsole . Je fais généralement tout cela dans une classe qui enveloppe ma console. De cette façon, il peut redirect les entrées / sorties vers la console dans le constructeur et réinitialiser les entrées / sorties dans le destructeur, ainsi que l’allocation / destruction de la console respectivement.

Cependant, sans utiliser une classe ou des wrappers, cela peut se faire comme suit.

Exemple:

 #include  #include  #include  #include  std::streambuf *CinBuffer, *CoutBuffer, *CerrBuffer; std::fstream ConsoleInput, ConsoleOutput, ConsoleError; void RedirectIO() { CinBuffer = std::cin.rdbuf(); CoutBuffer = std::cout.rdbuf(); CerrBuffer = std::cerr.rdbuf(); ConsoleInput.open("CONIN$", std::ios::in); ConsoleOutput.open("CONOUT$", std::ios::out); ConsoleError.open("CONOUT$", std::ios::out); std::cin.rdbuf(ConsoleInput.rdbuf()); std::cout.rdbuf(ConsoleOutput.rdbuf()); std::cerr.rdbuf(ConsoleError.rdbuf()); } void ResetIO() { ConsoleInput.close(); ConsoleOutput.close(); ConsoleError.close(); std::cin.rdbuf(CinBuffer); std::cout.rdbuf(CoutBuffer); std::cerr.rdbuf(CerrBuffer); CinBuffer = NULL; CoutBuffer = NULL; CerrBuffer = NULL; } LRESULT __stdcall WindowProcedure(HWND Hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch(Msg) { case WM_CREATE: AllocConsole(); RedirectIO(); std::cout<<"HELLO CONSOLE!"< 
 #include  HWND myConsole = GetConsoleWindow(); //window handle ShowWindow(myConsole, 0); //handle window 

La solution que j’ai fini par utiliser consistait à définir Linker-> System-> SubSystem sur “Windows (/ SUBSYSTEM: WINDOWS)” au lieu de “Console (/ SUBSYSTEM: CONSOLE)”. Cela ne fait même pas apparaître la console, ce qui évite le scintillement. La deuxième solution a été meilleure pour moi et a rendu le premier obsolète.