類別 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;
}