class WIN32OLE::Event
WIN32OLE::Event
对象控制 OLE 事件。
公共类方法
message_loop 点击切换源代码
转换和分发 Windows 消息。
static VALUE fev_s_msg_loop(VALUE klass) { ole_msg_loop(); return Qnil; }
new(ole, event) #→ WIN32OLE::Event 对象。 点击切换源代码
返回 OLE 事件对象。第一个参数指定 WIN32OLE
对象。第二个参数指定 OLE 事件名称。
ie = WIN32OLE.new('InternetExplorer.Application') ev = WIN32OLE::Event.new(ie, 'DWebBrowserEvents')
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; }
公共实例方法
handler 点击切换源代码
返回处理程序对象。
static VALUE fev_get_handler(VALUE self) { return rb_ivar_get(self, rb_intern("handler")); }
handler= 点击切换源代码
设置事件处理程序对象。如果处理程序对象具有与 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_set_handler(VALUE self, VALUE val) { return rb_ivar_set(self, rb_intern("handler"), val); }
off_event([event]) 点击切换源代码
删除事件的回调。
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_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; }
on_event([event]){...} 点击切换源代码
定义回调事件。如果省略参数,则此方法定义所有事件的回调。 如果要修改回调中的引用参数,请在回调中返回哈希。 如果要将值作为回调结果返回到 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(int argc, VALUE *argv, VALUE self) { return ev_on_event(argc, argv, self, Qfalse); }
on_event_with_outargs([event]){...} 点击切换源代码
定义事件的回调。如果要修改回调中的参数,可以使用此方法代替 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_on_event_with_outargs(int argc, VALUE *argv, VALUE self) { return ev_on_event(argc, argv, self, Qtrue); }
unadvise → nil 点击切换源代码
断开 OLE 服务器的连接。如果调用此方法,则 WIN32OLE::Event
对象将不再接收 OLE 服务器事件。此方法是试用实现。
ie = WIN32OLE.new('InternetExplorer.Application') ev = WIN32OLE::Event.new(ie) ev.on_event() { something } # ... ev.unadvise
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; }