今までのサンプルのソースでは、イベントループ処理に
while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; }
と、このようなループ処理をしてきました。
これは、キューからメッセージを受け取るGetMessageの戻り値が
0になる (=WM_QUITがポストされる) までは、取得したメッセージを
ウィンドウプロシージャに送りつづけることを意味しています。
しかし、この関数のマニュアルによると、
例えば第二引数にウィンドウのハンドルを指定していた時に、
hWndが無効なウインドウハンドルであった場合などで
エラーが発生した時、戻り値は -1 になると書かれています。
その場合も、上記のようなループ方法だと
ループが持続してしまい、致命的なアプリケーションエラーを
発生させる可能性があるようなのです。
複雑なプログラムを作る時に、操作するウィンドウがひとつでない場合
GetMessageでハンドルを指定する必要が出ることもあるかもしれませんが
そんな時には、
int bRet; while (TRUE) { bRet = GetMessage(&msg, hWnd, 0, 0) //エラーorWM_QUITならループを抜ける if(bRet!=1) break; //メッセージの処理 TranslateMessage(&msg); DispatchMessage(&msg); }
といったように、エラーが起こった場合にはすぐ
ループを抜けられるように、戻り値を監視しておくとよいでしょう。
というお話でした。たいしたことではありませんが・・・
2005/6/5