Konsole schließt Anwendung
-
Hoi ho,
In meiner normalen Win32 App habe ich in den Logger eine Konsole eingebaut, erstelle also manuell eine per AllocConsole(). Läuft auch prima, neben dem Loggen in Datei hab ich nu optional auch eine direkte Konsole.
Problem: Wenn man die Konsole schließt wird die komplette App sofort gegrillt -> genau das will ich verhindern.
Man müsste also entweder die WM_CLOSE Message vom ConsolenWindow abfangen (dessen hWnd ich nicht direkt von AllocConsole bekomme) oder verbieten, dass das Konsolenfenster überhaupt geschlossen werden kann.
Hat wer vielleicht nen Tipp für z.B. ne fertige WinAPI Funktion die das erledigen könnte?
-
Ob das Posting Nr. 5 von 6 wird auf das keiner ne Antwort weiß/antworten will?...
Ok, nochma.. Vielleicht hab ich mich umständlich ausgedrückt....
Ich erstelle in meiner std. Windows App eine Debug Console mit:
... if (console) if (AllocConsole() != 0) { freopen("CONOUT$", "a", stderr); freopen("CONOUT$", "a", stdout); freopen("CONIN$", "a", stdin); console_ = true; } ...
Läuft prima
Bis auf die Tatsache dass wenn man die Console schließt indem man z.B. auf des X oben rechts klickt (;)) die Anwendung SOFORT getoastet wird und NICHT normal beendet wird. Nun ist klar dass ich das unterbinden will..
-
Ach egal, hab nu selbst gesucht.. für alle die's interessiert:
if (console) if (AllocConsole() != 0) { freopen("CONOUT$", "a", stderr); freopen("CONOUT$", "a", stdout); freopen("CONIN$", "a", stdin); std::string conText = (std::string)"OnionEngine DebugLog " + filename; SetConsoleTitle(conText.c_str()); Sleep(40); HWND hConWnd = FindWindow(0, conText.c_str()); HMENU hSysMenu = GetSystemMenu(hConWnd, FALSE); DeleteMenu(hSysMenu, SC_CLOSE, MF_BYCOMMAND); DrawMenuBar(hConWnd); console_ = true; }
filename = Name der Logdatei in die parallel geschrieben wird.. -> kann weggelassen werden oder durch sonstwas ersetzt werden.
Außerdem gibts leider keine direkte Möglichkeit um ein hWnd einer Console zu bekommen unter einem nicht-Server-Windows...
-
Damit du auch mal eine Antwort bekommst - auch wenn sie dir evtl. nicht allzu viel hilft
Hier gab's das Problem vor 3 Wochen schonmal: http://www.c-plusplus.net/forum/viewtopic.php?t=69733
Wohl nur ein Hirngespinst, aber du könntest versuchen dich zwischendurch immer wieder mit FreeConsole davon zu trennen und sie bei Bedarf mit AttachConsole wieder zu holen (falls das so klappt)
-
Mit FreeConsole würde ich die Console komplett löschen, also würde auch kein AttachConsole funktionieren
Es ging ja auch darum zu verhindern dass der User die Console schließen kann und das wär mit obigen Code erledigt. Auch wenn er etwas unschön ist ^^
-
Evtl. geht das auch mit SetConsoleCtrlHandler() und einer HandlerRoutine().
-
Hmm, nein schade, ich habs getestet und es gibt ein paar sehr unhübsche Nebeneffekte. Ich kann zwar den Close Command abfangen, jedoch erscheint nach 2 Sekunden das allseits bekannte Windows Fensterchen "Programm reagiert nicht. Sofort beende/Abbruch?"...
BOOL __stdcall ConsoleHandlerRoutine(DWORD ctrlType) { switch (ctrlType) { // ... case CTRL_CLOSE_EVENT: // SetConsoleCtrlHandler(&ConsoleHandlerRoutine, FALSE); // FreeConsole(); return true; // ... } return false; }
Auch will ein FreeConsole() innerhalb der Routine nicht so richtig, um wenigstens NUR die Konsole und nicht die komplette App zu schließen.
Da muss es doch was eleganteres geben um ans hWnd einer manuell erstellten Konsole zu kommen, als die Methode mit FindWindow? Ich meine die hat schließlich den Nachteil, dass wenn "zufällig" ein 2. Fenster mit gleichem Titel existiert sie u.U. nicht läuft...
Edit:
Die Funktion ist aber dennoch hilfreich um STRG+C und STRG+BREAK abzufangen, thx
-
HWND GetConsoleWindow(void);
-
hallo,
do kannst in einem thread abfragen ob der taskmanager offen ist
wenn ja dan den tastmanager killen
-
Findsch' au...
24.04.2004