Task automatisch beenden
-
hi,
ich hab ein programm geschrieben welches hauptsächlich directX als i/o-schnittstelle benutzt. daher musst ich mich nie um die windows-struktur kümmern. daher hab ich auch null ahnung was dem betrifft. jedoch ist mein directX programm mittlerweilen präsentationswürdig, jedoch bleibt es immer beim beenden im vollbildmodus stehen, da ich den task nicht beenden kann. und immer nach dem beenden noch alt-f4 zu drücken ist nicht die feine art. ich zeig hier mal noch den gekürzten quelltext welchen ich mir zusammengesucht habe(hab ne auch getestet).
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h> #include <stdio.h> // #include ... #include <mmsystem.h> //--------------------------------------------------------------------------- LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); return 0; }; return DefWindowProc(hWnd, msg, wParam, lParam); }; HINSTANCE g_hInstance; HWND g_hWnd; MSG g_msg; int g_iCmdShow; void WinInit(void) { WNDCLASS wc; wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = g_hInstance; wc.hIcon = LoadIcon(0, IDI_APPLICATION); wc.hCursor = LoadCursor(0, IDC_ARROW); wc.hbrBackground= 0; wc.lpszMenuName = 0; wc.lpszClassName= "Test/n"; RegisterClass(&wc); g_hWnd=CreateWindow( "Test/n", "Test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, g_hInstance, 0); ShowWindow(g_hWnd, g_iCmdShow); UpdateWindow(g_hWnd); }; void WinClose(void) { while (GetMessage(&g_msg, NULL, 0, 0)) { TranslateMessage(&g_msg); DispatchMessage(&g_msg); }; DestroyWindow(g_hWnd); g_hWnd=NULL; }; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { g_hInstance=hInstance; g_iCmdShow=iCmdShow; WinInit(); // { ... PROGRAMM ... } WinClose(); return g_msg.wParam; };
-
1. warum verwendest du keine Code-Tags?
2. ...muss ich zugeben, dass ich dein Programm nicht ganz verstehe. Hast du
keinen Mainloop? In deiner Fassung wird der Abruf der Windows-Nachrichten
doch nur einmal ganz am Schluss gemacht, oder steh ich grad auf dem
Schlauch? Und die Nachrichtenabfrag in die WinClose() zu schreiben find ich
auch nicht sehr treffend...Mfg, smasher1985
-
Das hier würde ungefähr Sinn machen:
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h> #include <stdio.h> #include <mmsystem.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(g_msg) { case WM_DESTROY: WinClose(); PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, msg, wParam, lParam); } HINSTANCE g_hInstance; HWND g_hWnd; MSG g_msg; int g_iCmdShow; void WinInit(void) { WNDCLASS wc; wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = g_hInstance; wc.hIcon = LoadIcon(0, IDI_APPLICATION); wc.hCursor = LoadCursor(0, IDC_ARROW); wc.hbrBackground= 0; wc.lpszMenuName = 0; wc.lpszClassName= "Test/n"; RegisterClass(&wc); g_hWnd=CreateWindow( "Test/n", "Test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, g_hInstance, 0); ShowWindow(g_hWnd, g_iCmdShow); UpdateWindow(g_hWnd); } void WinClose(void) { DestroyWindow(g_hWnd); g_hWnd=NULL; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { g_hInstance=hInstance; g_iCmdShow=iCmdShow; WinInit(); while (GetMessage(&g_msg, NULL, 0, 0)) { TranslateMessage(&g_msg); DispatchMessage(&g_msg); } return g_msg.wParam; }
[ Dieser Beitrag wurde am 16.03.2003 um 20:15 Uhr von Hepi editiert. ]
-
@smasher1985:
zu 1.
keine ahnung was du mit Code-Tags meinst.?zu 2.
das eigentliche programm ist nach guter alter dos-manier geschrieben und versteckt sich hinter der zeile// { ... PROGRAMM ... }
. ich hab mir wie schon gesagt diesen code zusammengesucht ohne zu wissen was er bedeutet. mit der hoffnung das die WinMain()-procedur wirklich der alten main()-procedur entspricht (wie es in vielen tutorials behauptet wird). jedoch beendet sich das programm mit dem austritt aus der WinMain()-procedur nicht. was mich hier etwas ratlos macht.
die nachrichten aus der WndProc() lese ich nicht aus weil ich meine ganzen eingaben mit direct-input abfrage (und eigentlich auch gar nicht weiß was ich mit den nachrichten anfangen soll). dies ist mein erstes windows-programm, daher ist mir die logik die hinter den zwei proceduren ( WinMain() und WndProc() ) nicht geläufig. ich hab gehofft das es nur einen kleinen aufruf bedarf um das programm zu beenden, und dass ich dafür nicht weiter in die windowslogik hineinquälen muss (ist ja keine fenster-anwendung, sondern ein directx-fullscreen-spiel).@Hepi:
ich glaub nicht, dass das was ändern wird, da immer noch die selben funktionen, immer noch in der gleichen abfolge aufgerufen werden.
(werds aber dennoch probieren, da ich mich als nicht-profi hier leicht irren kann.)
-
@SK-Genius:
Bevor Du anfängst, Windows-Programme zu coden, solltest Du mal die Arbeitsweise von Windows verstehen lernen!Das sich Dein Programm nicht beendet liegt daran, das Dein Programm die Nachricht "Beende Dich!" von Windows an Dein Programm vollkommen ignoriert!
Windows arbeitet nachrichtenbasiert! Nicht DU bestimmst, wie dein Programm läuft, sondern Windows!
Tu Dir selbst nen Gefallen und kauf Dir DIES BUCH hier!
-
@Hepi:
danke für den hinweis auf die arbeitsweise von windows.da muss ich wohl in den sauren apfel beißen und einiges an geld und zeit investieren.
dennoch hoffe ich das mir jemand ne "standart lösung" geben kann, damit ich mir das ersparen kann. es geht ja nur darum am ende nicht immer noch zusätzlich die alt-f4-tastenkombination zu drücken (soviel quelltext kann das doch nicht sein, oder?). auch hier sei noch mal daran erinnert, dass ich für den ablauf meines programms die windows-nachrichten nicht brauche, da ich mir alle infos über direct-imput hole.
die anderen directx-spieleprogrammierer müsten doch so ne art "standart lösung" haben, mit der sie die windows-nachrichten abtun, da sie die ja auch nicht brauchen (soweit meine hoffnung). wenn es sowas gibt könntet ihr mir zeigen wie es geht? das würde mir echt helfen.
-
Also, alle DirectX-Programme, die ich so kenne, verarbeiten Windows-Nachrichten. Alle Nachrichten, die ein Programm nicht verarbeitet, werden durch
return DefWindowProc(hWnd, msg, wParam, lParam);
an die "DefaultWindowsProzedur" weitergegeben.
Eine "Standard-Lösung", wie Du sie erfragst, erfordert, das Du nach "Windows-Standard" programmierst. Da Du angeblich auf keine Windows-Nachrichten reagierst, DirectX aber eine Windows-basierte Schnittstelle ist, wirst Du auch keine "Standard-Lösung" präsentiert bekommen!Keine Ahnung, was Du da zusammengezimmert hast... mich wundert das da überhaupt ein brauchbares Ergebnis herauskommt.
Deine Fragen sind evtl. bei http://www.zfx.info besser aufgehoben!
[ Dieser Beitrag wurde am 16.03.2003 um 22:31 Uhr von Hepi editiert. ]
-
Zitat von Hepi:
Keine Ahnung, was Du da zusammengezimmert hast... mich wundert das da überhaupt ein brauchbares Ergebnis herauskommt.
gell, wundert mich auch.
hab allerdings auch schon zehn jahre programmiererfahrung (jedoch null unter windows). und mag es nicht glauben, aber das spiel hat schon ansehnliche formen angenommen. dies ist auch der grund warum ich jetzt diesen bug los werden wollte. (wollte es auch mal meinen bekannten zuschicken. aber in einer Version wo sie nicht gleich denken, dass ihr computer abgestürzt ist).p.s.:
ich hab gehört das directx überhaupt nicht windows typisch ist und gegen viele windows-regeln verstoßen soll. nur dadurch soll es (für im vergleich zu anderen typischen windows-schnittstellen) so schnell sein und andere sachen (wie den vollbildmodus) überhaupt erst ermöglichen.
-
Jo,
also ich wollte in keinster Weise Deine Programmiererfahrung in Frage stellen, sorry wenn das so rübergekommen sein sollte...
Ein weiteres gutes Buch für Dich wäre
3D Spieleprogrammierung mit DirectX in C/C++ von Stefan Zerbst.Stefan Zerbst liest/schreibt auch in diesem Forum, allerdings ist die Chance auf Antwort größer auf Zerbies Homepage....
Seine Homepage findest Du hier!
Evtl. sind die dort ansässigen Cracks in der Lage, Dir auf die Schnelle zu helfen...Es ist halt so das sich DOS und Windows-Programme vollkommen voneinander unterscheiden!
-
du wirst es nicht glauben, aber nach ein paar mal hin und her probieren hab ich es geschafft. (dem glück sei dank)
ich musste nur aus:
void WinClose(void) { while (GetMessage(&g_msg, NULL, 0, 0)) { TranslateMessage(&g_msg); DispatchMessage(&g_msg); }; DestroyWindow(g_hWnd); g_hWnd=NULL; };
folgendes mache:
void WinClose(void) { DestroyWindow(g_hWnd); g_hWnd=NULL; while (GetMessage(&g_msg, NULL, 0, 0)) { TranslateMessage(&g_msg); DispatchMessage(&g_msg); }; };
ich hab zwar keine ahnung wieso, aber se geht.