Mitigación: personalizar implementaciones de IMessageFilter.PreFilterMessage

En las aplicaciones de Windows Forms destinadas a versiones de .NET Framework a partir de .NET Framework 4.6.1, una implementación personalizada de IMessageFilter.PreFilterMessage puede filtrar mensajes de forma segura al llamar al método Application.FilterMessage si la implementación de IMessageFilter.PreFilterMessage:

  • Realiza una o dos de las siguientes acciones:

  • El elemento And proporciona mensajes mediante una llamada al método Application.DoEvents.

Impacto

Este cambio solo afecta a aplicaciones de Windows Forms que tienen como destino versiones de .NET Framework a partir de .NET Framework 4.6.1.

Para las aplicaciones de Windows Forms destinadas a las versiones anteriores de .NET Framework, en algunos casos, tales implementaciones inician una excepción IndexOutOfRangeException cuando se llama al método Application.FilterMessage.

Mitigación

Si no quiere este cambio, las aplicaciones que tienen como destino .NET Framework 4.6.1 o una versión posterior pueden optar por no recibirlo; para ello se debe agregar el siguiente ajuste de configuración a la sección <runtime> del archivo de configuración de la aplicación:

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

Además, las aplicaciones que tienen como destino versiones anteriores de .NET Framework, pero que se ejecutan en .NET Framework 4.6.1 o una versión posterior, pueden optar por recibir en este comportamiento; para ello, se debe agregar el siguiente ajuste de configuración a la sección <runtime> del archivo de configuración de la aplicación:

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

Vea también