Бөлісу құралы:


Устранение рисков: пользовательские реализации IMessageFilter.PreFilterMessage

В приложениях Windows Forms, ориентированных на версии .NET Framework начиная с 4.6.1, пользовательская реализация IMessageFilter.PreFilterMessage может безопасно фильтровать сообщения, когда вызывается метод Application.FilterMessage, если реализация IMessageFilter.PreFilterMessage:

  • Выполняет одно или оба из следующих действий:

    • Добавляет фильтр сообщений путем вызова AddMessageFilter метода.

    • Удаляет фильтр сообщений путем вызова RemoveMessageFilter метода. метод.

  • И перекачивает сообщения, вызывая Application.DoEvents метод.

Воздействие

Это изменение влияет только на приложения Windows Forms, предназначенные для версий .NET Framework, начиная с .NET Framework 4.6.1.

Для приложений Windows Forms, предназначенных для предыдущих версий .NET Framework, такие реализации в некоторых случаях вызывают 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>

См. также