处理在本机C++的事件

在处理本机 C++ 的事件,安装了,分别,使用 event_sourceevent_receiver 属性的事件源和事件接收器指定 type=native。 这些属性使它们适用于激发事件和事件在本机的类,非 COM 上下文。

声明事件

在事件源类,请使用在方法声明的 __event 关键字声明方法作为事件。 确保声明方法,但是,不要定义它,这样做将生成编译器错误,,因为编译器隐式地定义方法,该方法进行转换为事件。 本机事件可能与零个或多个参数的方法。 返回类型可以是无效或任何整型。

定义事件处理程序

将事件接收器类,可以定义一个事件处理程序,与签名的方法 (返回类型,调用约定和参数) 符合事件它们将处理。

挂钩事件的事件处理程序

在事件接收器类,可以使用内部函数 __hook 关联事件与事件处理程序和 __unhook 取消从事件处理程序的事件。 可以将多个事件设置事件处理程序,或多个事件处理程序添加到事件。

激发事件

若要激发事件,请调用方法声明为事件源类的事件。 如果处理程序挂钩到事件,处理程序将调用。

ee2k0a7d.collapse_all(zh-cn,VS.110).gif本机 C++ 事件代码

下面的示例演示如何激发在本机 C++ 的事件。 若要编译并运行此示例,请参见代码中的注释。

示例

ee2k0a7d.collapse_all(zh-cn,VS.110).gif代码

// evh_native.cpp
#include <stdio.h>

[event_source(native)]
class CSource {
public:
   __event void MyEvent(int nValue);
};

[event_receiver(native)]
class CReceiver {
public:
   void MyHandler1(int nValue) {
      printf_s("MyHandler1 was called with value %d.\n", nValue);
   }

   void MyHandler2(int nValue) {
      printf_s("MyHandler2 was called with value %d.\n", nValue);
   }

   void hookEvent(CSource* pSource) {
      __hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
      __hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
   }

   void unhookEvent(CSource* pSource) {
      __unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
      __unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
   }
};

int main() {
   CSource source;
   CReceiver receiver;

   receiver.hookEvent(&source);
   __raise source.MyEvent(123);
   receiver.unhookEvent(&source);
}

ee2k0a7d.collapse_all(zh-cn,VS.110).gifOutput

MyHandler2 was called with value 123.
MyHandler1 was called with value 123.

请参见

参考

事件处理