[GoCODE]SendMessage[GELÖST] Neues Topic: Perfektes Beenden
-
Auch wenn das in sehr vielen Dokus favorisiert wird.

-
Korrekt beendet wird mit der DefWindowProc der WM_CLOSE (mit einem PostQuitMessage () in der WM_DESTROY oder WM_NCDESTROY).
-
Sorry, Spamfilter !

-
Wenn Du Dein Programm beenden möchtest, das ein fenster hat, dan:
1. Zerstöre das Main Window mit DestroyWindow (oder sende WM_CLOSE wenn es sein muss).
2. Im WM_DESTROY Handler platziere ein PostQuitMessage.PostQuitMessage sollte nur im Response auf die Zerstörung des Main Windows gesendet werden....
Selbst wenn ich in manchen Fällen "Don Quichote" bin, gibt es genug andere die richtige Antworten geben können. Also stelle lieber allgemein eine Frage zur Diskussion...
-
Martin Richter schrieb:
Selbst wenn ich in manchen Fällen "Don Quichote" bin, gibt es genug andere die richtige Antworten geben können. Also stelle lieber allgemein eine Frage zur Diskussion...
Habe ich gemacht.
Zusammenfassend ist zu sagen: Wenn ich mein Programm von einer beliebigen Stelle des Programmmes beenden möchte z.B.: Per Escapetastendruck dann schaut meine Window Procedure wie folgt aus:LRESULT CALLBACK WindowProcedure(HWND hWindow,HINSTANCE hInstance,WPARAM wParam,LPARAM lParam,unsigned int message) { switch(message) { case WM_KEYDOWN: DestroyWindow(hWindow) break; case WM_DESTROY: PostQuitMessage(wParam); // Das Programm wird mit der gedrückten Taste beendet // bzw um korrekt zu sein: Der virtuelle // Tastencode der gedrückten Taste wird als // Exitcode verwendet. Zufrieden? break; } }Richtig so?(Und ja ich weis das man jede andere Botschaft an Windows via DefWindowProc weiterleiten muss.
)
-
Ja, kannst Du so machen (Dir ist aber schon klar, das bei dem Code, Dein Fenster bei jeder Taste beendet wird, oder? Nicht nur bei Escape
.).Hoffe, Du hälst mich für kompetent genug
... falls nicht frag am besten nochmal Martin, oder er bescheinigt mir ausreichende Kompetenzen zur Beantwortung Deiner Fragen
- dann kannst Du Dir auch ganz sicher sein *grinz*.PS: Das, im Aufruf von PostQuitMessage, angegebene 'wParam' als Parameter ist falsch, siehe: http://msdn2.microsoft.com/en-us/library/ms632620.aspx

MSDN zu WM_DESTROY schrieb:
Parameters:
- wParam: This parameter is not used.

- lParam: This parameter is not used.
EDIT: Das ist jawohl n Witz oder:
C-Chris schrieb:
LRESULT CALLBACK WindowProcedure(HWND hWindow,HINSTANCE hInstance,WPARAM wParam,LPARAM lParam,unsigned int message)Dazu sag ich jetzt mal nix...

- wParam: This parameter is not used.
-
CodeFinder schrieb:
Ja, kannst Du so machen (Dir ist aber schon klar, das bei dem Code, Dein Fenster bei jeder Taste beendet wird, oder? Nicht nur bei Escape
.).Hoffe, Du hälst mich für kompetent genug
... falls nicht frag am besten nochmal Martin, oder er bescheinigt mir ausreichende Kompetenzen zur Beantwortung Deiner Fragen
- dann kannst Du Dir auch ganz sicher sein *grinz*.PS: Das, im Aufruf von PostQuitMessage, angegebene 'wParam' als Parameter ist falsch, siehe: http://msdn2.microsoft.com/en-us/library/ms632620.aspx

MSDN zu WM_DESTROY schrieb:
Parameters:
- wParam: This parameter is not used.

- lParam: This parameter is not used.
EDIT: Das ist jawohl n Witz oder:
C-Chris schrieb:
LRESULT CALLBACK WindowProcedure(HWND hWindow,HINSTANCE hInstance,WPARAM wParam,LPARAM lParam,unsigned int message)Dazu sag ich jetzt mal nix...

*LOL* einmal habe ich sowas von RECHT. Ich sage nur "this Parameter is not used" . Den Parameter übergebe ich und er ist von WM_KEYDOWN benützt. Er übergibt nähmlich den Virtuellen Tastencode der gedrückten Taste und ja mir ist schon klar, dass ich bei jeder Taste das Programm beende. Wie kommst du darauf: wParam von "WM_DESTROY"?!(Davon ist hier garnicht die Rede
) Und was gibt es an meiner WindowProcedure zu meckern :p
EDIT: Ich sollte vielleicht noch schreiben, dass ich das wParam das durch einen Tastendruck in "g_wLastKeyDownParam" speichere.
Würde dann in etwas so aussehen://Global: WPARAM g_wLastKeyDownParam; //WindowProc: case WM_KEYDOWN: g_wLastKeyDownParam = wParam; SendMessage(hWindow,WM_DESTROY,NULL,NULL); break; case WM_DESTROY: PostQuitMessage(g_wLastKeyDownParam); break;Das hier war nur zur Vollständigkeit. Damit auch CodeFiner es versteht

Und CodeFinder was sagst du nun? Ach ja und vielleicht muss ich den wParam Datentyp noch in einen Integer umwandeln(Für PostQuitMessage). Ich habe kein SDK da um das auszuprobieren. Wahrscheinlich ist WPARAM nur ein typedef...habe da aber keine Ahnung
Es wäre nett wenn du schreibst: "Ja stimmt! ".
- wParam: This parameter is not used.
-
C-Chris schrieb:
Und was gibt es an meiner WindowProcedure zu meckern :p
Sie ist falsch.
C-Chris schrieb:
Wie kommst du darauf: wParam von "WM_DESTROY"?!(Davon ist hier garnicht die Rede
)Tja, Eigentor. Doch davon ist die Rede, vergleiche mal Deinen eigenen (von Dir geposteten) Code:
C-Chris schrieb:
LRESULT CALLBACK WindowProcedure(HWND hWindow,HINSTANCE hInstance,WPARAM wParam,LPARAM lParam,unsigned int message) { switch(message) { case WM_KEYDOWN: DestroyWindow(hWindow) break; case WM_DESTROY: PostQuitMessage(wParam); // Das Programm wird mit der gedrückten Taste beendet // bzw um korrekt zu sein: Der virtuelle // Tastencode der gedrückten Taste wird als // Exitcode verwendet. Zufrieden? break; } }Das wParam *muss* also in Bezug von WM_DESTROY verwendet worden sein, da ist nur als Parameter Deine WndProc definiert ist, sonst nicht. Hättest Du hier direkt Dein 'g_wLastKeyDownParam' eingefügt, wäre die Sache klar gewesen.
C-Chris schrieb:
case WM_KEYDOWN: g_wLastKeyDownParam = wParam; SendMessage(hWindow,WM_DESTROY,NULL,NULL); break;Uff, sagmal, hast Du Dir durchgelesen, was Martin Dir erklärt hat?!

C-Chris schrieb:
Es wäre nett wenn du schreibst: "Ja stimmt! ".
Würde ich gerne...
-
Oh mein Gott.

Dann eben://Global: WPARAM g_wPrevParam; //WndProc: case WM_KEYDOWN: DestroyWindow(hWindow); g_wPrevParam = wParam; break; case WM_DESTROY: PostQuitMessage(g_wPrevParam); break;So richtig? Noch was? Was gibst an meiner WndProc auszusetzen?
-
Deine "WndProc" (als __stdcall) mit -5- Parametern entfernt immer -5- Parameter kurz vor Funktionsende vom Stack.
Das Betriebssystem ruft sie aber mit nur -4- Parametern auf.
Früher oder später verursacht die "WndProc" mit -5- Parametern einen fetten Stackfault.
-
So sieht der Prototyp einer Fensterprozedur aus:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam);Und nicht anders.
-
CodeFinder schrieb:
So sieht der Prototyp einer Fensterprozedur aus:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam);Und nicht anders.
Öhm wieso? Die Namen können varrieren etc...und wenn man einen anderen Prototypen hat
. Keine Ahnung aber ich habe das schon oft genung gesehen. Ausserdem kann man die "uiMsg" doch nennen wie man mächte und man kann das ganze ohne Bedenken machen funzt einwandfrei. 
Naja aber wenn ihr meint
Was ist eigentlich ein Stackfault? Keine
!
Dann mal gute Nacht.P.S.: Auch "WndProc" kann so heisen wie es möchte

-
Also die endgültige Lösung dieses Threades ist:
1. Zum Beenden eines Programmes(sofern man es an einer anderen Stelle beenden möchte wie es gewöhnlich der Fall wäre) einfach an die besagte Stelle DestroyWindow(HWND hWindow) einsetzen.
2. In der WindowProcedure(WndProc) muss dann(bzw immer) auf WM_DESTROY eingegangen werden. Am besten wie folgt:
case WM_DESTROY: PostQuitMessage(0); break;Dieser Thread ist an dieser Stelle geschlossen ,da es nichts mehr zu sagen gibt und alle Probleme und Missverständnisse geklärt wurden. Wenn ihr noch eine Anmerkung zu diesem Post macht wird dieser(nicht eurer sondern DER hier) Post editiert werden. Also kein Quote.(daran wird sich niemand halten
)
-
C-Chris schrieb:
Öhm wieso? Die Namen können varrieren etc...und wenn man einen anderen Prototypen hat
. Keine Ahnung aber ich habe das schon oft genung gesehen. Ausserdem kann man die "uiMsg" doch nennen wie man mächte und man kann das ganze ohne Bedenken machen funzt einwandfrei. 
Naja aber wenn ihr meint
Was ist eigentlich ein Stackfault? Keine
!
Dann mal gute Nacht.P.S.: Auch "WndProc" kann so heisen wie es möchte

Laaber-Rhabarber...vllt solltset Du erstmal programmieren lernen.
Mit Prototyp bezeichnet man nicht den Namen der Funktion oder der Parameter, sondern den Typ des Return-Wertes, die Aufrufkonvention, die Anzahl der Parameter bzw. deren Typen usw., deswegen habe ich zuvor ja auch schon den Begriff Funktions-'Syntax' erwähnt. Sowas sollte man aber eigentlich wissen (
Grundwissen)... wie gesagt: Lern erstmal programmieren.Natürlich sind die Namen egal.
C-Chris schrieb:
Dieser Thread ist an dieser Stelle geschlossen, [...]
PS: Und unterlasse dich bitte dieses alberne Moderator-Getue, das nervt.
-
CodeFinder schrieb:
C-Chris schrieb:
Öhm wieso? Die Namen können varrieren etc...und wenn man einen anderen Prototypen hat
. Keine Ahnung aber ich habe das schon oft genung gesehen. Ausserdem kann man die "uiMsg" doch nennen wie man mächte und man kann das ganze ohne Bedenken machen funzt einwandfrei. 
Naja aber wenn ihr meint
Was ist eigentlich ein Stackfault? Keine
!
Dann mal gute Nacht.P.S.: Auch "WndProc" kann so heisen wie es möchte

Laaber-Rhabarber...vllt solltset Du erstmal programmieren lernen.
Mit Prototyp bezeichnet man nicht den Namen der Funktion oder der Parameter, sondern den Typ des Return-Wertes, die Aufrufkonvention, die Anzahl der Parameter bzw. deren Typen usw., deswegen habe ich zuvor ja auch schon den Begriff Funktions-'Syntax' erwähnt. Sowas sollte man aber eigentlich wissen (
Grundwissen)... wie gesagt: Lern erstmal programmieren.Natürlich sind die Namen egal.
C-Chris schrieb:
Dieser Thread ist an dieser Stelle geschlossen, [...]
PS: Und unterlasse dich bitte dieses alberne Moderator-Getue, das nervt.
Sowas war klar.
Naja egal ich kenn dich ja CodeFinder. Also fröhliche Weihnachten :xmas1:MfG C-ChR1S
P.S.: Lern du mal nett sein.(zumindestens an Weihnachten) und lasse diese destruktiven Beiträge die nicht zum Thema beitragen du musst immer das letzte Wort haben.
P.P.S.: Ich bekomm nen´ Petzold zu Weihnachten

-
Hallo
Also ich finde nähmlich sollte auch zensiert werden.

chrische