ユーザー入力に反応しない MFC Visual-C++ アプリケーションがあります。
(注: 現在、1 台のマシンでのみ確認されています。この動作はときどき再発しますが、アプリを数日間実行した後でのみ発生します!)
アプリケーションは、Alt-Tab (またはタスク バー) で切り替えると再描画されますが、たとえば、タイトル バーをクリックしてメイン ウィンドウをアクティブにすることはできません。
WinDbg を使用して既に 4 つのダンプをプルし、アクティブな命令を確認しました。私たちは常に、メイン スレッド (GUI スレッド) 内でコードの再描画などを行っていました。私たちは間違いなくモーダル メッセージ ループに陥っていた/していないので、メイン スレッドのスタックは常に「OK」に見えました。(ほとんど/すべてのワーカー スレッドはアイドル状態で、何らかのイベントを待っていましたが、疑わしいコードもありませんでした。)
Spy++で問題を調査すると、この別の質問でも指定されている動作が見られます。つまり、ペイントとアクティベーション メッセージを取得しているように見えますが、ユーザー入力はアプリケーションにルーティングされません。画面にアプリケーションウィンドウがあり、それを選択してメインウィンドウのメッセージを表示すると、
「一般的な」「参照」メッセージのみが表示され、他には何も表示されません
さらに掘り下げて、プロセス全体のすべてのメッセージを選択すると、
これが私たちが見るものです:
アプリは明らかに 1 つの非表示のサブウィンドウ (00CB09F0) でのみメッセージを処理しており、そこには1 秒あたり 200 の WM_PAINT メッセージの一定のストリームが表示されます。
通常、このサブ ウィンドウはメッセージをまったく処理していません (Windows がメッセージを送信するときの WM_PAINT などの更新を除く)。これは通常、描画領域として使用され、描画はその親 (010A09B8) ウィンドウの WM_TIMER メッセージによって行われます。(ただし、この WM_TIMER メッセージはハングしているアプリにも表示されません。)
プロセス エクスプローラーに表示されるパフォーマンス プロファイルは次のようになります (100% カーネル時間、多かれ少なかれ):