ウィンドウ マネージャー関数に再帰呼び出しが予期せず失敗する場合があります。

現象

USER32 でエクスポートして、ウィンドウ マネージャー関数に再帰呼び出しです。DLL は、要求された操作を実行せず、エラー コードを設定せずに返すことがあります。これは、深くネストされたウィンドウの階層を持つアプリケーションで一般的に発生します。現象の間で発生する可能性があります。

  • 深くネストされたウィンドウの階層を持つアプリケーションは、フレーム ウィンドウのサイズが変更されたときは、子ウィンドウを正しくサイズ変更に失敗します。Windows は移動か、MoveWindow、SetWindowPos または DeferWindowPos を呼び出すことによってサイズを変更します。

  • ウィンドウ メッセージは、親ウィンドウまたは子ウィンドウが期待どおりにするには反映されません。DefWindowProc 親ウィンドウまたはメッセージを受け取るウィンドウの子ウィンドウへのメッセージは正常に伝達されません。

  • ウィンドウ メッセージは、SendMessageTimeout または SendMessageCallback は、受信していない、指定したウィンドウで呼び出し、1 つのウィンドウに送信されます。

さらに、それ以外の場合は正常に機能するアプリケーションによっては、WH_CALLWNDPROC または WH_CALLWNDPROCRET のウィンドウのフックは、windows を所有しているアプリケーション内のスレッドに設定されている場合、上記の現象が発生することもできます。ウィンドウ フックは、SetWindowsHookEx 関数を呼び出すことで特定のスレッドまたはすべての UI スレッドで設定できます。

原因

この現象は、Windows が要求された操作を実行するために呼び出し元のスレッドのカーネル スタックを拡張することができません。追加のカーネル スタックの処理手順は、x64 のために必要なため Windows 環境では、カーネル スタックは、USER32 でウィンドウ マネージャー関数を呼び出す再帰を行うと、Windows 環境のエクスポート、x86 でより高速で消費されることができます。Dll 現象は、この資料に記載されているが、x64 Windows プラットフォームで発生する可能性が高く、x86 上のスレッドのカーネル スタックを使用する再帰的な呼び出しの可能性が Windows プラットフォームです。

解決方法

この問題を回避するのには次のソリューションを使用することができます。

  1. DefWindowProc にメッセージを渡す代わりに、WM_WINDOWPOSCHANGED のウィンドウ メッセージを処理するときの子ウィンドウのサイズを変更します。

  2. WM_WINDOWPOSCHANGED または、WM_SIZE ウィンドウ メッセージの処理中に子ウィンドウのサイズを変更するのではなく親ウィンドウのサイズが変更されるときに非同期的に子ウィンドウ サイズを調整します。

  3. ネストされたウィンドウの深さを減らすためにアプリケーションの UI のデザインを変更します。

詳細情報

Win32 サブシステムの一部は、カーネル モード デバイス ドライバー (WIN32K で実装します。。SYS)。USER32 によってエクスポートされる関数への呼び出しです。WIN32K には、位置、サイズなど、ウィンドウの状態を変更するのには DLL を呼び出します。要求された操作を実行するシステムです。通常ウィンドウの状態を変更する関数がウィンドウ メッセージの場所を変更するウィンドウに送信されると、WIN32K。SYS を変更するウィンドウのウィンドウ プロシージャを呼び出すユーザー モードのコールアウトを使用できます。WIN32K がある場合などです。SYS に SetWindowPos 関数を呼び出すことによって、サイズやウィンドウの位置が変更されたときは、WM_WINDOWPOSCHANGING ウィンドウ メッセージと WM_WINDOWPOSCHANGED のウィンドウのメッセージ ウィンドウが送信されます。DefWindowProc は WM_WINDOWPOSCHANGED メッセージを使用して呼び出す場合は、WM_SIZE メッセージに指定されたウィンドウに送信し、ウィンドウのサイズが変更されました。アプリケーション通常サイズを変更する子ウィンドウ、親ウィンドウ メッセージを受け取ると、WM_WINDOWPOSCHANGED または WM_SIZE ウィンドウ、WIN32K に再帰的な呼び出しが行われる。深くネストされたウィンドウの階層のシステムです。それ以外の場合は正常に機能するアプリケーションでは、WH_CALLWNDPROC または WH_CALLWNDPROCRET フックは、プロセス内のスレッドに設定されている場合、この資料に記載の現象が発生も可能性があります。これは、カーネル スタック領域が消費する場合 WIN32K。SYS は、フック プロシージャの呼び出しを処理します。呼び出し元のスレッドによって所有されているウィンドウにウィンドウ メッセージを送信する SendMessage を呼び出すことは通常 WIN32K を呼び出すことがなく、メッセージを受け取るウィンドウのウィンドウ プロシージャを呼び出します。SYS です。ただし、1 つは WIN32K を呼び出します。WH_CALLWNDPROC フックがある場合、SYS や WH_CALLWNDPROCRET、WIN32K として呼び出し元のスレッドのセットをフックします。SYS は、フック、フック プロシージャを呼び出してハンドルを管理します。前述したように、DefWindowProc が指定されたウィンドウ WM_WINDOWPOSCHANGED メッセージを使用して呼び出す場合は、WM_SIZE メッセージの送受信ウィンドウのサイズが変更されました。WH_CALLWNDPROC フックまたは、WH_CALLWNDPROCRET、SendMessage 呼び出し DefWindowProc カーネル モードへの移行には、フック プロシージャを呼び出すためになります。サイズ変更の子ウィンドウの順序でのカーネル モードの切り替えに 1 つの必要性を排除することによりカーネル スタックの使用量を減らすは WM_SIZE ウィンドウ メッセージではなく WM_WINDOWPOSCHANGED のウィンドウ メッセージを処理するときに、フック プロシージャを呼び出します。この問題が発生している Windows フォーム アプリケーションの開発者は、詳細については、KB 資料953934を参照してください。

ヘルプを表示

スキルを磨く
トレーニングの探索
新機能を最初に入手
Microsoft Insider に参加する

この情報は役に立ちましたか?

フィードバックをお送りいただきありがとうございます!

フィードバックをお寄せいただき、ありがとうございます。Office サポートの担当者におつなぎいたします。

×