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