これはMFC CDialog DoModal can't show window if parent window message queue is 'busy' '機能'によって発生します。メッセージキューにメッセージが含まれている場合、システムメッセージボックスは表示されません。 (。。投票またはそのバグにコメントしてください動作は非常に予想外である)
私はこれを使用して、キュー内のすべてのメッセージを読ましようとすることで、これを見つけ出し:
MSG msg = { 0 };
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TRACE(_T(R"--(,"% *.*s",PEEK,0x%08x,"%s",0x%08x,0x%08x,0x%08x)--" "\n"),
0, 0, _T(""), msg.hwnd, "Window HAS msg",
msg.message, msg.wParam, msg.lParam);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
これでしょうキュー内のすべてのメッセージを出力し、どのウィンドウおよびどのメッセージ(この場合はWM_PAINT
)が違反者であるかを表示しました。
これで、どのクラスオブジェクトが接続されていたかを追跡し、それがOnPaint()
ハンドラであることを確認しました。
前のプログラマーはCPaintDC
オブジェクトを作成する前にif
x次にreturn
の条件を入れました。コンストラクタはBeginPaint()
を呼び出し、無効領域を検証します。無効領域を検証せずに、無効領域が空になるまで、メッセージはWM_PAINT
のメッセージを生成し続けます。これにより、メッセージキューが空になることはありません。
これが問題ではあるが、問題のウィンドウとダイアログボックスとの関係がルートアプリケーションウィンドウの同じスレッドにあったということはわかりません。
-ROOT -ROOT
+-CHILD +-MESSAGE BOX
+-MESSAGE BOX +-CHILD
+-CHILD +-CHILD
+-CHILD +-CHILD < Offender
+-CHILD < Offender +-CHILD
+-CHILD
これはペイント/再描画の問題である可能性があります。 – 1201ProgramAlarm
@ 1201ProgramAlarmは、これが一般的なウィンドウのMessageBoxであるため、私はそれがどうなるかわかりません。 – Adrian
マルチモニタの設定を使用していますか?メッセージボックスを切断したモニタに表示できますか? – sergiol