缓解:自定义 IMessageFilter.PreFilterMessage 实现

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

影响

此更改仅影响面向从 .NET Framework 4.6.1 开始的 .NET Framework 版本的 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>

请参阅