缓解:自定义 IMessageFilter.PreFilterMessage 实现
在面向从 .NET Framework 4.6.1 开始的 .NET Framework 版本的 Windows 窗体应用中,如果 IMessageFilter.PreFilterMessage 实现可以满足以下要求,那么在调用 Application.FilterMessage 方法时,自定义实现 IMessageFilter.PreFilterMessage 可以安全地筛选消息:
执行下列一项或两项操作:
通过调用 AddMessageFilter 方法添加消息筛选器。
通过调用 RemoveMessageFilter 方法,删除消息筛选器。 方法。
以及通过调用 Application.DoEvents 方法抽取消息。
影响
此更改仅影响面向从 .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>