• 締切済み

メッセージループ

while(true) { if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if(msg.message==WM_QUIT) break; DispatchMessage(&msg); if(!GetMessage(&msg,NULL,0,0)) { return (int)msg.wParam; } } } else { } このソースで実行して消したら終了しませんでした。 なぜ終了できなかったのでしょうか?

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

WM_DESTROYでPostQuitMessage(0);を処理しないとウィンドウだけ消えてプログラムは終了しないですがどうでしょうか。

79562
質問者

お礼

回答ありがとうございます。WM_DESTROYでPostQuitMessage(0);はちゃんと出来てます。 それとソースが違っていました。 while(true) { if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if(msg.message==WM_QUIT) break; DispatchMessage(&msg); if(!GetMessage(&msg,NULL,0,0)) { } } } else { } です。

すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

質問と補足で内容が違うようですがとりあえず質問のほうで DispatchMessage( )をGetMessage( )の後ろに移動しましょう WM_QUITのチェックも不要でしょう if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if(!GetMessage(&msg,NULL,0,0)) { return (int)msg.wParam; } DispatchMessage(&msg);

79562
質問者

お礼

回答ありがとうございます。質問の件なのですが、なぜ if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if(msg.message==WM_QUIT) break; DispatchMessage(&msg); if(!GetMessage(&msg,NULL,0,0)) { } } なぜウィンドウが消えたのに実行中なのかということです。説明不足ですいません。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

>このソースで せっかくそこまでソースを載せたのですから、 どうせなら全部載せた方がいいとはお思いになりませんか? 回答しようとする人のところでも同じ現象を再現できる方が、 問題解決への早道だと思いますが、いかがでしょうか? >消したら 何を消したのでしょうか?

79562
質問者

お礼

説明不足ですみません。ウィンドウを消してもという意味でした。 ソースはこれです。 int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow) { // ミューテックスオブジェクトによる多重起動の防止 HANDLE hMutex=CreateMutex(NULL,TRUE,_T(__FILE__)); if(GetLastError()==ERROR_ALREADY_EXISTS) { MessageBox(NULL,_T("既に起動しています"),_T("起動できません"),MB_OK); return 0; } HRESULT hr=InitApp(hInst); if(FAILED(hr)) { DXTRACE_ERR_MSGBOX(_T("_tWinMain InitApp"),hr); return 0; } hr=InitDXGraphics(); if(FAILED(hr)) { DXTRACE_ERR_MSGBOX(_T("_tWinMain InitDXGraphics"),hr); DestroyWindow(g_hWnd); } else { hr=InitD3DObject(); if(FAILED(hr)) { DXTRACE_ERR_MSGBOX(_T("_tWinMain InitD3DObject"),hr); DestroyWindow(g_hWnd); } } if(g_bWndMode==false) // フルスクリーンモードで起動 { g_bWndMode=true; ChangeDisplayMode(); } MSG msg; timeBeginPeriod(1); // 最小分解能を1[ms]に設定する while(true) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(msg.message==WM_QUIT) break; DispatchMessage(&msg); if(!GetMessage(&msg,NULL,0,0)) { } } else { } } timeEndPeriod(1); CloseHandle(hMutex); return (int)msg.wParam; }

すると、全ての回答が全文表示されます。

関連するQ&A