Automatisches Schließen eines Konsolenprogrammes "komplett" verhindern
-
DN C++ Tutorial #1
Als ich ein bisschen durchs C++ Forum gestöbert bin hab ich viele Threads gefunden in denen gefragt wurde ob man das automatische Schließen einer Konsole komplett verhindern kann. Die Antworten waren meist "nein", was glücklicher Weise nicht stimmt.
So sieht bei mir ein gewöhnlicher C++ Script aus:#include <windows.h> #include <iostream> using namespace std; int main() { cout << "Automatisches Schließen eines Konsolenprogrammes verhindern!"; return 0; }
Durch return 0; wird das Konsolenprogramm geschloßen nachdem alle Befehle ausgeführt wurden, lässt man return 0; einfach weg lässt sich das Programm jedoch nicht komplimieren. Jetzt gibt es eine Möglichkeit das Programm durch Druck der Eingabetaste beenden zu lassen und auch eine Möglichkeit das Programm gar nicht beenden zu lassen und zwar ersetzt man dazu return 0; durch...
while(true) { while(GetAsyncKeyState(0x07) < 0) { return 0; } }
...was bewirkt, dass auf ein Tastendruck [VirtualKey 07] gewartet wird, [VirtualKey 07] ist eine undefinierte Taste, deshalb wird das Programm auch ewig auf den Tastendruck warten müssen und sich nicht schließen.
» Nicht #include <windows.h> & #include <iostream> vergessen, sonst gibt es ein paar saftige Fehlermeldungen!
Der vollständige neue Code sieht jetzt wie folgt aus:#include <windows.h> #include <iostream> using namespace std; int main() { cout << "Automatisches Schließen eines Konsolenprogrammes verhindern!"; while(true) { while(GetAsyncKeyState(0x07) < 0) { return 0; } } }
Ich hoffe ich konnte ein bisschen weiterhelfen (oder auch nicht [?]).
@Moderatoren: Ich denke, dass diese kleine Tutorial auch noch sehr gut hier her passt.
-
DaNemeziz schrieb:
Als ich ein bisschen durchs C++ Forum gestöbert bin hab ich viele Threads gefunden in denen gefragt wurde ob man das automatische Schließen einer Konsole komplett verhindern kann. Die Antworten waren meist "nein", was glücklicher Weise nicht stimmt.
Wo hast du denn das aufgeschnappt? Klar kann man verhindern, daß sich das Programm am Ende kommentarlos verabschiedet (und da wird auch niemand etwas gegenteiliges behaupten) - und in der FAQ gibt es wesentlich elegantere Lösungen als deine.
(davon, daß das Ding weder portabel ist noch so funktionieren wird, rede ich erst gar nicht)Eine andere Sache ist "kann ich verhindern, daß jemand mein Programm von außen abschießt" - und da ist die Antwort definitiv nein. Wenn du dich besonders hartnäckig anstellst, killt Windows einfach deinen kompletten Prozess (ohne dich darüber zu informieren).
PS: "return 0;" in der main()-Funktion kann auch weggelassen werden
-
CStoll schrieb:
Wo hast du denn das aufgeschnappt?
CStoll schrieb:
2. gibt es eine möglichkeit dass es sich GAR NICHT schließt? ^^
Eine Endlosschleife - aber einen Programmabbruch über Task-Manager (oder Netzschalter) kannst du damit auch nicht verhindern (gegen solche Maßnahmen hast du keinerlei Schutzmaßnahmen).
Wenn du es so machst wie ich es in der Tutorial beschrieben hat kann man das Programm wenigstens noch über Task-Manager (oder Netzschalter) schließen oder indem man einfach auf dem roten Kreuz klickt!
CStoll schrieb:
(davon, daß das Ding weder portabel ist noch so funktionieren wird, rede ich erst gar nicht)
Was meinst du mit das Ding? Wenn du das meint...
while(true) { while(GetAsyncKeyState(0x07) < 0) { return 0; } }
...klar funktioniert es!
CStoll schrieb:
PS: "return 0;" in der main()-Funktion kann auch weggelassen werden
Wenn du einen Compiler wie z. B. C++BuilderX von Borland verwendest, erhälst du dabei Fehlermeldungen.
-
DaNemeziz schrieb:
CStoll schrieb:
Wo hast du denn das aufgeschnappt?
CStoll schrieb:
2. gibt es eine möglichkeit dass es sich GAR NICHT schließt? ^^
Eine Endlosschleife - aber einen Programmabbruch über Task-Manager (oder Netzschalter) kannst du damit auch nicht verhindern (gegen solche Maßnahmen hast du keinerlei Schutzmaßnahmen).
Wenn du es so machst wie ich es in der Tutorial beschrieben hat kann man das Programm wenigstens noch über Task-Manager (oder Netzschalter) schließen oder indem man einfach auf dem roten Kreuz klickt!
Um den Effekt zu erreichen, brauchst du keine WinAPI-Basteleien - da reicht ein einfaches
while(true);
vollkommen aus.CStoll schrieb:
(davon, daß das Ding weder portabel ist noch so funktionieren wird, rede ich erst gar nicht)
Was meinst du mit das Ding? Wenn du das meint...
while(true) { while(GetAsyncKeyState(0x07) < 0) { return 0; } }
...klar funktioniert es!
bestimmt nicht - return beendet die enthaltene Funktion inklusive aller Schleifen, in denen es enthalten ist - und damit bewirkt das ganze Konstrukt gar keine Veränderung gegenüber dem Ursprungscode.
CStoll schrieb:
PS: "return 0;" in der main()-Funktion kann auch weggelassen werden
Wenn du einen Compiler wie z. B. C++BuilderX von Borland verwendest, erhälst du dabei Fehlermeldungen.
Dann nimm dir doch einen standardkonformen Compiler
-
Vielleicht bin ich ein Noob im Bereich C++, doch bevor du größe Töne spuckst und hier erzählst es funktioniert nicht teste es doch erstmal, ich hab es schon getestet und es funktioniert, also...
Mr. Besserwisser!
Hier ist nochmal der komplette \1:
#include <windows.h> #include <iostream> using namespace std; int main() { cout << "Automatisches Schließen eines Konsolenprogrammes verhindern!"; while(true) { while(GetAsyncKeyState(0x07) < 0) { return 0; } } }
-
Ich hab keine Ahnung, was die Funktion "GetAsyncKeyState(0x07)" zurückgibt, aber solang es etwas, was >= 0 ist, läuft dein Programm einfach nur in einer Endlosschleife... das ist sicher kein sehr schöner "Schließschutz".
-
The-Kenny schrieb:
Ich hab keine Ahnung, was die Funktion "GetAsyncKeyState(0x07)" zurückgibt, aber solang es etwas, was >= 0 ist, läuft dein Programm einfach nur in einer Endlosschleife... das ist sicher kein sehr schöner "Schließschutz".
Es funktioniert aber und ist eine Lösung, ich habe ja nicht gesagt dass es gut ist.
Und um dich ein bisschen zu lehren, die Funktion "GetAsyncKeyState(0x07)" bewirkt, dass auf einen undefienierten Tastendruck gewartet wird bevor return 0; ausgeführt wird.
-
//#include <windows.h> #include <iostream> using namespace std; int main() { cout << "Automatisches Schließen eines Konsolenprogrammes verhindern!"; while(true) { //while(GetAsyncKeyState(0x07) < 0) //{ //return 0; //} } return 0; }
Geht übrigens auch ohne deine komischen Konstrukte
-
Wenn der Witz sein sollte, dass GetAsyncKeyState(0x07) wartet (bis Ultimo), kann man das ganze auch wesentlich kürzer gestalten, denn die Schleifen bringen wie gesagt genau nichts.
#include <windows.h> #include <iostream> using namespace std; int main() { cout << "Automatisches Schließen eines Konsolenprogrammes verhindern!"; GetAsyncKeyState(0x07); }
Ansonsten sei mal ganz allgemein nicht so überheblich, sonst wirst Du noch hier rauskomplimiert
-
Hallo DaNemeziz,
kannst du mir mit deinem Code helfen?
Ich bekomme einen Fehler, dass der Compilre keine FunktionGetAsyncKeyState()
findet...
Waas mach ich falsch?P.S.: Wo gibt es eine <windows.h> und wofür ist die? Brauch ich die auch auf meinem Rechner?
Danke, Nichtsahnena
-
Ich glaub DaNemeziz kann dir helfen, der kann alles...
-
LordJaxom schrieb:
Wenn der Witz sein sollte, dass GetAsyncKeyState(0x07) wartet (bis Ultimo), kann man das ganze auch wesentlich kürzer gestalten, denn die Schleifen bringen wie gesagt genau nichts.
#include <windows.h> #include <iostream> using namespace std; int main() { cout << "Automatisches Schließen eines Konsolenprogrammes verhindern!"; GetAsyncKeyState(0x07); }
Ansonsten sei mal ganz allgemein nicht so überheblich, sonst wirst Du noch hier rauskomplimiert
Nein GetAsyncKeyState(virtualKeyCode) gibt den Status der Taste zurück, zB gedrückt nicht gedrückt, weiss nicht ob Windows da noch mehr kennt
Das was DaNemeziz macht ist simpel und einfach eine Endlosschleife. Da er einen verbuggten Kompiler benutzt, kann er das return 0; nicht einfach weglassen, da sonst eine Fehlermeldung kommt. Er hat sich also gedacht: "Na, da pack ich das return 0; doch einfach in eine while-Schleife deren Bedingung nie erfüllt wird". Dann hat er sich irgendwie einen unbesetzten Keycode gesucht und den in die Abfrage eingebaut. Sein Code erfüllt die selbe Funktion wie:while (true) ;
Naja, viele Umwege halt.
Gruß
Don06
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum DOS und Win32-Konsole verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
DaNemeziz schrieb:
Vielleicht bin ich ein Noob im Bereich C++, doch bevor du größe Töne spuckst und hier erzählst es funktioniert nicht teste es doch erstmal, ich hab es schon getestet und es funktioniert, also...
Mr. Besserwisser!
Das Kompliment gebe ich gerne zurück.
while(true)
{
while(GetAsyncKeyState(0x07) < 0)
{
return 0;
}
}
[/code]Zum Ablauf:
- while(true) - ist erfüllt, Schleifenrumpf wird abgearbeitet
- while(Get...) - bin ich mir nicht sicher, was der bei undefinierten Keys ausgibt. Entweder die Bedingung ist erfüllt, dann wird der innere Schleifenrumpf abgearbeitet (und beendet das Programm) oder die Bedingung ist nicht erfüllt, dann erreichst du mit der äußeren while() eine Endlosschleife (vermutlich trifft letzteres zu).
Fazit: Das ganze Konstrukt ist nur eine etwas kompliziertere Möglichkeit, eine Endlosschleife zu basteln. Wesentlich kürzer - und portabler - ist folgendes:while(true); return 0;//wenn der Compiler darauf besteht
-
Hilfe! schrieb:
Hallo DaNemeziz,
kannst du mir mit deinem Code helfen?
Ich bekomme einen Fehler, dass der Compilre keine FunktionGetAsyncKeyState()
findet...
Waas mach ich falsch?P.S.: Wo gibt es eine <windows.h> und wofür ist die? Brauch ich die auch auf meinem Rechner?
Danke, Nichtsahnena
Ich habe mich ein bisschen geirrt, das brauchst du gar nicht, es reicht auch aus einfach dies vor dem return 0; einzufügen:
while(true) { }
...das ganze würde dann wie folgt aussehen:
#include <iostream> using namespace std; int main() { [...] while(true) { } return 0; }
PS: Es funktioniert trotzdem mit dem GetAsyncKeyState(0x07), man muss einfach windows.h includen.
-
Danke, tolle Lösung!
Wenn ich aber <iostream> weglasse, klappt dein Code genauso
Wieso? Und wozu brauche ich das using namespace std?? Wenn ich das weglasse, geht der Code immernoch!
Und wozu die Klammern bei der While-Schleife? Wenn ich die weglasse, und stattdessen ein Semikolon setze, geht's ja auch noch!
Und wozu brauche ich das return 0? Wenn ich das weglasse, geht's tatsächlich AUCH NOCH!!
Ich zeig dir mal meinen verkürzten Code:
int main() { while(true); }
Und jetzt sei ruhig, und spuck nicht so große Töne...
-
@mikey: Das nennt man aktives mobbing
-
Ich hab mein Post mal editiert, da hatte ich noch mehr Fragen...
-
Aber ich habe keine 'windows.h":
P.S.: Wo gibt es eine <windows.h> und wofür ist die? Brauch ich die auch auf meinem Rechner?
Hat die eigentlich was mit dem Betribstsystemm zu tun oder nur mit Fenstern?
-
Ich glaub' ich bin jetzt tatsächlich dümmer als bevor ich diesen thread zu lesen begonnen hab.
Das hat noch keiner geschafft in diesem Forum.
-
Nichtsahnena schrieb:
Aber ich habe keine 'windows.h":
P.S.: Wo gibt es eine <windows.h> und wofür ist die? Brauch ich die auch auf meinem Rechner?
Hat die eigentlich was mit dem Betribstsystemm zu tun oder nur mit Fenstern?
Ja, die <windows.h> enthält die WinAPI-Funktionen und existiert nur auf Windows-Systemen. In DaNemeziz' ursprünglichen Beispiel brauchte man die für die GetAsyncKeyState()-Funktion.