C#如何判断一个事件是否被 Hook

标签 c# hook event-handling

我希望能够查明某个事件是否已连接。我环顾四周,但只找到涉及修改包含事件的对象的内部结构的解决方案。我不想这样做。

这是一些我认为可行的测试代码:

// Create a new event handler that takes in the function I want to execute when the event fires
EventHandler myEventHandler = new EventHandler(myObject_SomeEvent);
// Get "p1" number events that got hooked up to myEventHandler
int p1 = myEventHandler.GetInvocationList().Length;
// Now actually hook an event up
myObject.SomeEvent += m_myEventHandler;
// Re check "p2" number of events hooked up to myEventHandler
int p2 = myEventHandler.GetInvocationList().Length;

不幸的是,以上是完全错误的。我认为当我将事件挂接到它时,myEventHandler 中的“invocationList”会以某种方式自动更新。但不,事实并非如此。这个的长度总是返回一个。

有没有办法从包含事件的对象外部确定这一点?

最佳答案

如果相关对象指定了事件关键字,那么你唯一能做的就是添加(+=)和删除(-=)处理程序,仅此而已.

我相信比较调用列表的长度是可行的,但您需要在对象内部进行操作才能获取它。

此外,请记住 +=-= 运算符返回一个新的事件对象;他们不会修改现有的。

为什么要知道某个特定事件是否被挂接?是为了避免多次注册吗?

如果是这样,诀窍是首先删除处理程序 (-=),因为删除不存在的处理程序是合法的,并且不会执行任何操作。例如:

// Ensure we don't end up being triggered multiple times by the event
myObject.KeyEvent -= KeyEventHandler;
myObject.KeyEvent += KeyEventHandler;

关于C#如何判断一个事件是否被 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1129517/

相关文章:

c# 来自 outlook 的带有附件的新邮件

c# - Entity Framework Core 不尊重标识列

javascript - 在 vanilla JavaScript 和 jQuery 中禁用按钮

cocoa - 如何在 NSViewController 的子类中处理键盘事件?

c# - 使用 c# 复制文件夹和所有子文件夹和文件的最佳方法是什么

c# - 查询n :m-Relationships with LINQ

php - if 语句分组产品引用 woocommerce

c++ - 通过 .def 文件在 Linux 上 Hook 函数

jenkins - 在 Jenkins Pipelines 中删除作业之前运行脚本

Javascript 事件监听器问题