类 WIN32OLE::Event
公共类方法
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; }
公共实例方法
WIN32OLE_EVENT#handler 点击切换源代码
返回处理程序对象。
static VALUE fev_get_handler(VALUE self) { return rb_ivar_get(self, rb_intern("handler")); }
WIN32OLE_EVENT#handler= 点击切换源代码
设置事件处理程序对象。如果处理程序对象具有根据 XXX 事件的 onXXX 方法,则在发生 XXX 事件时调用 onXXX 方法。
如果处理程序对象具有 method_missing 并且没有根据事件的方法,则调用 method_missing 并且第一个参数是事件名称。
如果处理程序对象具有 onXXX 方法并且 WIN32OLE_EVENT#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); }
WIN32OLE_EVENT#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; }
WIN32OLE_EVENT#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(...) {|*args| {:return => 1, :xxx => yyy} }
static VALUE fev_on_event(int argc, VALUE *argv, VALUE self) { return ev_on_event(argc, argv, self, Qfalse); }
WIN32OLE_EVENT#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); }
WIN32OLE_EVENT#unadvise → nil 点击切换源代码
断开 OLE 服务器连接。如果调用此方法,则 WIN32OLE_EVENT 对象不再接收 OLE 服务器事件。此方法是试验性实现。
ie = WIN32OLE.new('InternetExplorer.Application') ev = WIN32OLE_EVENT.new(ie) ev.on_event() {...} ... 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; }