class WIN32OLE::Event
WIN32OLE::Event
对象控制 OLE 事件。
公共类方法
源码
static VALUE fev_s_msg_loop(VALUE klass) { ole_msg_loop(); return Qnil; }
翻译和调度 Windows 消息。
源码
static VALUE fev_initialize(int argc, VALUE *argv, VALUE self) { ev_advise(argc, argv, self); evs_push(self); rb_ivar_set(self, id_events, rb_ary_new()); fev_set_handler(self, Qnil); return self; }
返回 OLE 事件对象。第一个参数指定 WIN32OLE
对象。第二个参数指定 OLE 事件名称。
ie = WIN32OLE.new('InternetExplorer.Application') ev = WIN32OLE::Event.new(ie, 'DWebBrowserEvents')
公共实例方法
源码
static VALUE fev_get_handler(VALUE self) { return rb_ivar_get(self, rb_intern("handler")); }
返回处理程序对象。
源码
static VALUE fev_set_handler(VALUE self, VALUE val) { return rb_ivar_set(self, rb_intern("handler"), val); }
设置事件处理程序对象。如果处理程序对象具有根据 XXX 事件定义的 onXXX 方法,则当 XXX 事件发生时,将调用 onXXX 方法。
如果处理程序对象具有 method_missing 并且没有根据该事件定义的方法,则会调用 method_missing,并且第一个参数为事件名称。
如果处理程序对象具有 onXXX 方法,并且存在由 on_event('XXX'){}
定义的代码块,则会执行该代码块,但当 XXX 事件发生时不会调用处理程序对象的方法。
class Handler def onStatusTextChange(text) puts "StatusTextChanged" end def onPropertyChange(prop) puts "PropertyChanged" end def method_missing(ev, *arg) puts "other event #{ev}" end end handler = Handler.new ie = WIN32OLE.new('InternetExplorer.Application') ev = WIN32OLE::Event.new(ie) ev.on_event("StatusTextChange") {|*args| puts "this block executed." puts "handler.onStatusTextChange method is not called." } ev.handler = handler
源码
static VALUE fev_off_event(int argc, VALUE *argv, VALUE self) { VALUE event = Qnil; VALUE events; rb_scan_args(argc, argv, "01", &event); if(!NIL_P(event)) { if(!RB_TYPE_P(event, T_STRING) && !RB_TYPE_P(event, T_SYMBOL)) { rb_raise(rb_eTypeError, "wrong argument type (expected String or Symbol)"); } if (RB_TYPE_P(event, T_SYMBOL)) { event = rb_sym2str(event); } } events = rb_ivar_get(self, id_events); if (NIL_P(events)) { return Qnil; } ole_delete_event(events, event); return Qnil; }
移除事件的回调。
ie = WIN32OLE.new('InternetExplorer.Application') ev = WIN32OLE::Event.new(ie) ev.on_event('BeforeNavigate2') {|*args| args.last[6] = true } # ... ev.off_event('BeforeNavigate2') # ...
源码
static VALUE fev_on_event(int argc, VALUE *argv, VALUE self) { return ev_on_event(argc, argv, self, Qfalse); }
定义回调事件。如果省略参数,则此方法定义所有事件的回调。如果要在回调中修改引用参数,请在回调中返回哈希。如果想将值作为回调的结果返回给 OLE 服务器,请使用 ‘return’ 或 :return。
ie = WIN32OLE.new('InternetExplorer.Application') ev = WIN32OLE::Event.new(ie) ev.on_event("NavigateComplete") {|url| puts url} ev.on_event() {|ev, *args| puts "#{ev} fired"} ev.on_event("BeforeNavigate2") {|*args| # ... # set true to BeforeNavigate reference argument `Cancel'. # Cancel is 7-th argument of BeforeNavigate, # so you can use 6 as key of hash instead of 'Cancel'. # The argument is counted from 0. # The hash key of 0 means first argument.) {:Cancel => true} # or {'Cancel' => true} or {6 => true} } ev.on_event(event_name) {|*args| {:return => 1, :xxx => yyy} }
源码
static VALUE fev_on_event_with_outargs(int argc, VALUE *argv, VALUE self) { return ev_on_event(argc, argv, self, Qtrue); }
定义事件的回调。如果想在回调中修改参数,可以使用此方法,而不是 WIN32OLE::Event#on_event
。
ie = WIN32OLE.new('InternetExplorer.Application') ev = WIN32OLE::Event.new(ie) ev.on_event_with_outargs('BeforeNavigate2') {|*args| args.last[6] = true }
源码
static VALUE fev_unadvise(VALUE self) { struct oleeventdata *poleev; TypedData_Get_Struct(self, struct oleeventdata, &oleevent_datatype, poleev); if (poleev->pConnectionPoint) { ole_msg_loop(); evs_delete(poleev->event_id); poleev->pConnectionPoint->lpVtbl->Unadvise(poleev->pConnectionPoint, poleev->dwCookie); OLE_RELEASE(poleev->pConnectionPoint); poleev->pConnectionPoint = NULL; } OLE_FREE(poleev->pDispatch); return Qnil; }
断开 OLE 服务器连接。如果调用此方法,则 WIN32OLE::Event
对象将不再接收 OLE 服务器事件。此方法为试用实现。
ie = WIN32OLE.new('InternetExplorer.Application') ev = WIN32OLE::Event.new(ie) ev.on_event() { something } # ... ev.unadvise