3

少し問題があります。最初に例を示し、次に何が問題なのかを説明します。

例:

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

この例は正しく機能しますが、「GetMessage」関数のパラメーター2が次のようにwindowのハンドル名に変更された場合:

例2:変更後

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

プログラムを終了するときに少し問題が発生します。それでもプログラムはプロセスリストで動作します。そしてそれを選択し、プログラムを終了するためにプロセス終了ボタンをクリックする必要があります

そして今、add(NULLまたはウィンドウハンドル)の間に違いはありますか?

4

2 に答える 2

5

2番目の例で発生する問題は、ウィンドウが破棄された後、指定したウィンドウハンドルが無効にGetMessage()なることです。後続のすべての呼び出しは、そのことを通知するためにエラーを返します(をGetLastError()与えることERROR_INVALID_WINDOW_HANDLEで)が、コードはこのケースを処理しないため、永久にビジーループになります。

これが、MSDNライブラリページがGetMessage()を使用しないようにアドバイスする理由while (GetMessage(...))です。

于 2012-05-11T16:09:36.643 に答える
0

提示した2つの例の根本的な違いは、アプリケーションによるメッセージの処理方法です。最初の例では、アプリケーション内で作成できる任意のウィンドウのメッセージキューからメッセージをプルします。後者の例では、関数に渡されるハンドルに関連付けられたウィンドウからのみメッセージをプルします。アプリケーション内に多くのウィンドウを作成できる可能性があります。特定のウィンドウのメッセージのキャプチャのみに関心がある場合、そのパラメータは、変換されてウィンドウプロシージャ関数にディスパッチされるメッセージを制限するのに役立ちます。ただし、ウィンドウを1つだけ作成する場合は、その違いはごくわずかです。

于 2012-05-11T15:59:43.563 に答える