Найти все обработчики событий для элемента управления Windows Forms в .NET - PullRequest
2 голосов
/ 04 октября 2010

Есть ли способ найти все обработчики событий для Windows Forms элемента управления?Специально статически определенные обработчики событий?

Ответы [ 3 ]

4 голосов
/ 04 октября 2010

Windows Forms имеет сильные контрмеры против этого. Большинство элементов управления хранят ссылку на обработчик событий в списке, для которого требуется секретный файл cookie. Значение cookie создается динамически, вы не можете угадать его заранее. Reflection - это бэкдор, вы должны знать имя переменной cookie. Например, событие для Control.Click называется «EventClick», это можно увидеть в справочном источнике или в Reflector.

Это все невероятно непрактично, если вы чувствуете, что делаете что-то неразумно, значит, вы на правильном пути. Вы можете найти пример кода, который делает это в моем ответе в этой теме .

1 голос
/ 04 октября 2010

Элементы управления Windows Forms используют свойство EventHandlerList с именем Events для хранения обработчиков событий, чтобы вы могли выполнить итерацию этой коллекции.Чтобы определить, какие подписанные обработчики являются статическими, вам нужно будет использовать отражение .

0 голосов
/ 18 ноября 2016

Этот код получит обработчики событий для элемента управления

Private Function getEventHandlers(ctrl As Control) As System.ComponentModel.EventHandlerList
    Dim value As System.ComponentModel.EventHandlerList = Nothing
    Try
        Dim propInfo As System.Reflection.PropertyInfo = GetType(Control).GetProperty("Events", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Static)
        If propInfo IsNot Nothing Then value = CType(propInfo.GetValue(ctrl), System.ComponentModel.EventHandlerList)
    Catch ex As Exception
    End Try
    Return value
End Function

У меня были проблемы с добавлением обработчиков событий более одного раза, что приводило к нескольким вызванным событиям. Следующее позволит вам проверить, есть ли у элемента управления обработчик для указанного события.

Private Function hasEventHandler(ctrl As Control, Optional eventName As String = "Click") As Boolean
    Dim value As Boolean = False
    Try
        Dim handlerList As System.ComponentModel.EventHandlerList = getEventHandlers(ctrl)
        Dim controlEventInfo As System.Reflection.FieldInfo = GetType(Control).GetField("Event" + eventName, Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static)
        If controlEventInfo IsNot Nothing Then
            Dim eventKey As Object = controlEventInfo.GetValue(ctrl)
            Dim EventHandlerDelegate As [Delegate] = handlerList.Item(eventKey)
            If EventHandlerDelegate IsNot Nothing Then value = True
        End If
    Catch ex As Exception
    End Try
    Return value
End Function
...