GetMessageの注意点

今回はGetMessage関数についてのお話です。

・戻り値(TRUE,0,-1)

今までのサンプルのソースでは、イベントループ処理に

     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


戻る