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