类 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;
}