获取控件实例的当前事件处理函数句柄
来源:互联网 发布:学校软件哪个好 编辑:程序博客网 时间:2024/04/29 06:10
突然想设计一个能在RunTime时,改变控件大小和位置的功能,而且要求尽量纯.NET而不用Win32的钩子。最重要的是对一般的界面设计透明,不要过多地影响普通界面设计的过程。 初步想法是,用一个类来处理一个Control,在变成设计态时,先保存现在的Mouse和Key的处理函数,并取消他们,然后用我们自己的Mouse和Key句柄替代原来的消息处理。在退出设计态时再恢复原来消息处理函数。
取消和添加消息处理有AddHandler 和 RemoveHandler ,但找了半天没有发现能获取当前控件消息函数的功能,于是Google了半天,东拼西凑了一些资料得到了下面的代码。如哪位有更好的办法,还请不吝赐教
Public Function GetEventSubscribers()Function GetEventSubscribers(ByVal target As Object, ByVal eventName As String) As [Delegate]()
Dim WinFormsEventName As String = ("Event" & eventName)
Dim t As Type = target.GetType
Do
Dim fia As FieldInfo() = t.GetFields((BindingFlags.NonPublic Or (BindingFlags.Static Or BindingFlags.Instance)))
Dim fi As FieldInfo
For Each fi In fia
Dim d As [Delegate]
'Debug.WriteLine(fi.Name)
If (fi.Name = eventName) Then
d = CType(fi.GetValue(target), [Delegate])
If (Not d Is Nothing) Then
Return d.GetInvocationList
End If
End If
If (fi.Name = WinFormsEventName) Then
Dim ehl As EventHandlerList = DirectCast(target.GetType.GetProperty("Events", (BindingFlags.FlattenHierarchy Or (BindingFlags.NonPublic Or BindingFlags.Instance))).GetValue(target, Nothing), EventHandlerList)
d = ehl.Item(fi.GetValue(target))
If (Not d Is Nothing) Then
Return d.GetInvocationList
End If
End If
Next
t = t.BaseType
Loop While (Not t Is Nothing)
Return New [Delegate](0 - 1) {}
End Function
Dim WinFormsEventName As String = ("Event" & eventName)
Dim t As Type = target.GetType
Do
Dim fia As FieldInfo() = t.GetFields((BindingFlags.NonPublic Or (BindingFlags.Static Or BindingFlags.Instance)))
Dim fi As FieldInfo
For Each fi In fia
Dim d As [Delegate]
'Debug.WriteLine(fi.Name)
If (fi.Name = eventName) Then
d = CType(fi.GetValue(target), [Delegate])
If (Not d Is Nothing) Then
Return d.GetInvocationList
End If
End If
If (fi.Name = WinFormsEventName) Then
Dim ehl As EventHandlerList = DirectCast(target.GetType.GetProperty("Events", (BindingFlags.FlattenHierarchy Or (BindingFlags.NonPublic Or BindingFlags.Instance))).GetValue(target, Nothing), EventHandlerList)
d = ehl.Item(fi.GetValue(target))
If (Not d Is Nothing) Then
Return d.GetInvocationList
End If
End If
Next
t = t.BaseType
Loop While (Not t Is Nothing)
Return New [Delegate](0 - 1) {}
End Function
- 获取控件实例的当前事件处理函数句柄
- 通过控件句柄获取控件实例
- jquery提交前事件
- Form绑定提交前事件
- 获取应用程序实例句柄
- 获取控件句柄
- Wpf 获取控件句柄
- 获取当前焦点控件句柄
- 获取窗口句柄函数大全
- 几个获取窗口句柄函数
- 获取窗口句柄函数集合
- Ecology7二次开发:添加浏览按钮弹窗前事件代码
- 窗口函数中获取主程序实例句柄的三种方法
- 窗口函数中获取主程序实例句柄的三种方法
- MFC中窗口句柄和控件句柄的获取
- 函数和文件处理
- 如何获取应用程序的 实例句柄?
- 如何获取应用程序的实例句柄?
- ASP.NET开发中的权限问题
- JavaScript身份证和出生日期的验证
- KMP算法C++代码
- 2006.10.08 N计划的第一天
- IT精英们不断上演的十大傻事?
- 获取控件实例的当前事件处理函数句柄
- AI是什么
- 英特尔展示300美元NB 挑战MIT百元PC机
- 网站备案全攻略(一)
- 类型库导入程序(Tlbimp.exe)
- 网站备案全攻略(二)
- gwt 学习总结一下。
- 第二章
- 三层式开发中的层次划分讨论