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