GetMessage の書き方について。

GetMessage について何かおもしろい使い方がないかな・・。と調べてみましたら、
おもしろい記述が見つかりました。

GetMessage はメッセージループの部分に書かれており、大抵は

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

という風に書かれています。

私がいつも見に行く解説サイトを見直してみてもそうでしたし、
過去に書いたソースコードもそうなっていました。

 

ですが、 MSDN の GetMessage 関数の説明を見てみますと、
MSDN:GetMessage 関数

エラーが発生した場合、-1 が返ります。

たとえば、hWnd パラメータで無効なウィンドウハンドルを指定した場合や、
lpMsg で無効なポインタを指定した場合は、エラーが発生します。

拡張エラー情報を取得するには、 関数を使います。

ということで。
そして、英語版MSDNではこんな感じのサンプルが上がっていました。

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

うーむ・・。
GetMessage の戻り値は BOOL のはずでは・・? と。思ってしまったり。

でも、BOOL って結局 int になってますから、 型としてはあっているんでしょうけど。

 

にしても・・。 BOOL だったら、 == 0 or != 0 でせう。と。
まぁー・・。そんな感じで。

GetMessage の書き方について。」への2件のフィードバック

  1. Dai

    実は僕も、
     while(GetMessage(&msg,NULL,0,0))
    のような書き方をしていたので、「-1」の場合は・・・?と悩んでいました。
    英語のMSDNにはサンプルがあったんですね!
    参考になりました。ありがとうございます。

  2. Mimura 投稿作成者

    >Dai 様

    確かに-1 が帰ると書いてあったら、対応に困りますよね。

    記事を読み返していて、これはC言語系ですから、
    while((bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
    という書き方ができますが、これが BASIC 系だったら・・w なんて。ふと思ってしまいました。

    理想としては、 GetMessage でエラー or PostQuitMessage(0) の時には 0 を返してもらって、
    エラーかどうかは GetLastError 関数で返す仕掛けにしてもらえれば・・。と思いましたが、
    もしかすると -1 が帰ったときは、 lpmsg とhwnd を正しく設定し直す処理を書くのかなぁ・・。何となく厳しい気もしますが・・。 うーむw

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です