Wird mein Programm/Prozess korrekt beendet?
-
Hallöchen

Ich habe einen Trainer für die Siedler II - 10th Anniversary Demo geschrieben. Mein Problem liegt aber im Bereich von WinAPI, deswegen poste ichs mal hier.
Der Trainer ansich funktioniert wunderbar allerdingt wurde mir gesagt das sich mein Prozess nicht richtig beendet. Ich habe schon im Code gesucht ob ich vergessen habe ein handle zu schließen oder etwas vergessen habe. Ich kenne mich nicht sondlerlich mit dem WinAPI aus und bin mir nicht sicher ob ich "PostQuitMessage(0);" richtig verwende.Insgesammt gibt es drei Möglichkeiten das Programm zu beenden:
-Escape Tastendruck
-Mausklick auf 'X'
-per WindowsMsg ALT + F4 oder TaskManagerDeswegen wollte ich fragen ob sich ein erfahrer Programmierer mal den Sourcecode anschauen kann? Habe den Code hier hochgeladen:
http://www.file-upload.net/download-420329/SettlersTrainerlight.rar.html
-
Setze mal PostQuitMessage (0) in die "case WM_CLOSE" der WndProc () und nicht ans Ende der WinMain ().
-
und dann wird alles korrekt beendet? (Ich trau dem Frieden noch nicht so richtig :p)
-
ruf' ExitProcess() auf. dagegen kann sich kaum ein programm wehren.

-
Hmmmmm...
ja daran habe ich schon gedacht, aber ich find das dann so... wie soll ich sagen!? ... naja ich würde sagen etwas brutal und unsauber. Normalerweise sollte es auch ohne korrekt funktionieren. Mir wäre es lieber die Funktion zu vermeiden.
-
PostQuitMessage
-
PostQuitMessage
wtf? unfertiger Beitrag? oder sollte das vielleicht ein link sein?
-
Du oslltest mal die Doku lesen, wenn Dir jemand einen Tipp gibt. PostQuitMessage wird normalerweise aus WM_DESTROY heraus aufgerufen. Dies geschieht aber normalerweise automatisch. Auch WM_CLOSE wird korrekt behandelt in der DefWindowProc.
Wenn das Programm beendet werden soll, dann ruf einfach DestroyWindow für Dein Main Window auf (Fall VK_ESCAPE). Das führt dazu das PostQuitMessage gesendet wird. Undverlasse nicht einfach die Nachrichtenschleife
Du darfst in keinem Fall aus WM_DESTROY mit einem return rausgehen.
Das setzen von done kannst Du bleiben lassen.Deine Nachrichtenschleife verlässt Du nur wenn WM_QUIT ankommt. Thats It.
BTW: Warum machst Du es Dir so schwer mit den Tasten?
GetKeyboardState ist weitaus einfacher und leifert Dir alle Keys auf einmal.
-
Wenn die "case WM_DESTROY" entsprechend geändert wird, kann die "case WM_CLOSE" auch ganz gestrichen werden.
Eine "Wirklich beenden ? Ja/Nein"-Nachfrage ist ja nicht vorgesehen.
-
Stimmt WM_CLOSE brauchst du nicht behandeln. Diesen Default macht alles die DefWindowProc für Dich.
Ich habe noch mal nachgelesen:
In WM_DESTROY musst Du selbst PostQuitMessage aufrufen. Der DefWndowProc sendet diese nachricht nicht (Ich weißt auch nicht wie ich darauf gekommen bin, dass es so wäre).Aber ansonsten sollte Deine Nachrichtenschleife auf WM_QUIT warten.