次の方法で共有


軽減策:カスタムの IMessageFilter.PreFilterMessage 実装

.NET Framework の .NET Framework 4.6.1 以降のバージョンを対象とする Windows フォーム アプリでは、Application.FilterMessage メソッドが呼び出されると、カスタムの IMessageFilter.PreFilterMessage 実装は IMessageFilter.PreFilterMessage 実装が次のような場合に、メッセージを安全にフィルター処理できます。

  • 次の操作のいずれか、または両方を行う場合:

    • AddMessageFilter メソッドを呼び出してメッセージ フィルターを追加する。

    • RemoveMessageFilter メソッドを呼び出してメッセージ フィルターを削除する。 メソッドをオーバーライドします。

  • なおかつApplication.DoEvents メソッドを呼び出してメッセージをポンプする場合。

影響

この変更によって影響を受けるのは、.NET Framework の .NET Framework 4.6.1 以降のバージョンを対象とする Windows フォーム アプリのみです。

.NET Framework の以前のバージョンを対象とする Windows フォーム アプリの場合、このような実装で、Application.FilterMessage メソッドが呼び出されると IndexOutOfRangeException 例外がスローされることがあります。

軽減策

この変更が望ましくない場合は、.NET Framework 4.6.1 以降のバージョンを対象とするアプリでこの変更を無効にできます。これは、そのアプリの構成ファイルの <runtime> セクションに次の構成設定を追加して行います。

<runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Forms.DontSupportReentrantFilterMessage=true" />
</runtime>

また、以前のバージョンの .NET Framework を対象とするものの、.NET Framework 4.6.1 以降のバージョンで実行されているアプリでは、そのアプリの構成ファイルの <runtime> セクションに構成設定を追加して、この動作を有効にすることができます。

<runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Forms.DontSupportReentrantFilterMessage=false" />
</runtime>

関連項目