正しいメッセージループについて

昔と今で変わっている

Windowsプログラムを作成する場合、昔はメッセージループを、以下のようにしていました。(VC++6.0は以下のソースを吐きます。)

MSG msg;
while(GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
}

しかし、現在は以下のようにしなければなりません。

MSG msg;
BOOL bRet;
while ( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0 ) {
    if (bRet == -1) {
        //handle the error and possibly exit
    } else {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }
}

GetMessageの仕様を確認してみると、エラーが発生した場合、-1 が返ります。たとえば、hWnd パラメータで無効なウィンドウハンドルを指定した場合や、lpMsg で無効なポインタを指定した場合は、エラーが発生します。と書かれています。猫でもわかるプログラミングさんのところにも書かれていますが、従来の書き方では、エラーが発生した場合にループから抜け出すことができません。戻り値のチェックをするようにしましょう。