缓解:自定义 IMessageFilter.PreFilterMessage 实现

在面向从 .NET Framework 4.6.1 开始的 .NET Framework 版本的 Windows 窗体应用中,如果 IMessageFilter.PreFilterMessage 实现可以满足以下要求,那么在调用 Application.FilterMessage 方法时,自定义实现 IMessageFilter.PreFilterMessage 可以安全地筛选消息:

影响

此更改仅影响面向 .NET Framework 4.6.1 及以上版本的 Windows 窗体应用。

对于针对旧版本的 .NET Framework 的 Windows 窗体应用,有时调用IndexOutOfRangeException方法时,此类实现会引发Application.FilterMessage异常。

缓解措施

如果此更改不可取,面向 .NET Framework 4.6.1 或更高版本的应用可以通过将以下配置设置添加到 <应用的配置文件的运行时> 部分来选择退出该更改:

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

此外,面向早期版本的 .NET Framework 但运行在 .NET Framework 4.6.1 或更高版本下的应用可以通过将以下配置设置添加到 <应用的配置文件的运行时> 部分来选择加入此行为:

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

另请参阅