BrowserEventHandler onFocusInHandler;
BrowserEventHandler onFocusOutHandler;
BrowserEventHandler onclickHandler;
private void axWebBrowser1_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
{
if (axWebBrowser1.ReadyState == SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE)
{
//获取内嵌框架
mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)axWebBrowser1.Document;
mshtml.IHTMLElementCollection fm = ((mshtml.IHTMLDocument3)doc).getElementsByTagName("iframe");
mshtml.IHTMLWindow2 frm = (mshtml.IHTMLWindow2)doc.parentWindow;
mshtml.FramesCollection frms = frm.frames;
int frmcount = frms.length;
mshtml.IHTMLWindow2 frm8000 = null;
mshtml.IHTMLWindow2 frm8032 = null;
mshtml.IHTMLWindow2 ifram = null;
object x;
int i = 0;
foreach (object obj in fm)
{
x = i;
i++;
mshtml.DispHTMLFrameElement fm2 = obj as mshtml.DispHTMLFrameElement;
if (fm2.id == "iframe8032") { frm8032 = (mshtml.IHTMLWindow2)frms.item(ref x); }
if (fm2.id == "iframe8000") { frm8000 = (mshtml.IHTMLWindow2)frms.item(ref x); }
if (fm2.id == "ifram") { ifram = (mshtml.IHTMLWindow2)frms.item(ref x); }
}
if (frm8000 != null) { ifrm8000(frm8000); }
if (frm8032 != null) { ifrm8032(frm8032); }
if (ifram != null) { ifrm8000(ifram); }
} }void ifrm8000(mshtml.IHTMLWindow2 frm)
{
mshtml.IHTMLDocument2 idc = frm.document;
mshtml.IHTMLElementCollection hec = ((mshtml.IHTMLDocument3)idc).getElementsByTagName("input");
mshtml.DispHTMLInputElement photo = null;
foreach (object obj in hec)
{
photo = obj as mshtml.DispHTMLInputElement;
if (photo.id == "tel")
{
onFocusOutHandler = new BrowserEventHandler();
onFocusOutHandler.Fire = new ElementEventFire(GetPhoneNo_8000);
//这里想给 GetPhoneNo_8000() 方式传入一些参数,比如一个object类型的参数,该怎么设置。
photo.onfocusout = onFocusOutHandler;
}
}
}
void GetPhoneNo_8000()
{
//这里想得到一些由调用函数传入参数。
}
[ComVisible(true)]
public sealed class BrowserEventHandler
{
private ElementEventFire fire;
public ElementEventFire Fire
{
set { this.fire = value; }
} [DispId(0)]
public bool Handler()
{
this.fire();
return true;
}
} public delegate void ElementEventFire();由于页面里很多iframe,通过循环进行处理,如果用一个变量,得到的参数往往是最后一个设置的变量值,而不是值,
我想在 定义
void GetPhoneNo_8000()时加上参数,
在 onFocusOutHandler.Fire = new ElementEventFire(GetPhoneNo_8000); 调用时穿进去,请教高手。
BrowserEventHandler onFocusOutHandler;
BrowserEventHandler onclickHandler;
private void axWebBrowser1_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
{
if (axWebBrowser1.ReadyState == SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE)
{
//获取内嵌框架
mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)axWebBrowser1.Document;
mshtml.IHTMLElementCollection fm = ((mshtml.IHTMLDocument3)doc).getElementsByTagName("iframe");
mshtml.IHTMLWindow2 frm = (mshtml.IHTMLWindow2)doc.parentWindow;
mshtml.FramesCollection frms = frm.frames;
int frmcount = frms.length;
mshtml.IHTMLWindow2 frm8000 = null;
mshtml.IHTMLWindow2 frm8032 = null;
mshtml.IHTMLWindow2 ifram = null;
object x;
int i = 0;
foreach (object obj in fm)
{
x = i;
i++;
mshtml.DispHTMLFrameElement fm2 = obj as mshtml.DispHTMLFrameElement;
if (fm2.id == "iframe8032") { frm8032 = (mshtml.IHTMLWindow2)frms.item(ref x); }
if (fm2.id == "iframe8000") { frm8000 = (mshtml.IHTMLWindow2)frms.item(ref x); }
if (fm2.id == "ifram") { ifram = (mshtml.IHTMLWindow2)frms.item(ref x); }
}
if (frm8000 != null) { ifrm8000(frm8000); }
if (frm8032 != null) { ifrm8032(frm8032); }
if (ifram != null) { ifrm8000(ifram); }
} }void ifrm8000(mshtml.IHTMLWindow2 frm)
{
mshtml.IHTMLDocument2 idc = frm.document;
mshtml.IHTMLElementCollection hec = ((mshtml.IHTMLDocument3)idc).getElementsByTagName("input");
mshtml.DispHTMLInputElement photo = null;
foreach (object obj in hec)
{
photo = obj as mshtml.DispHTMLInputElement;
if (photo.id == "tel")
{
onFocusOutHandler = new BrowserEventHandler();
onFocusOutHandler.Fire = new ElementEventFire(GetPhoneNo_8000);
//这里想给 GetPhoneNo_8000() 方式传入一些参数,比如一个object类型的参数,该怎么设置。
photo.onfocusout = onFocusOutHandler;
}
}
}
void GetPhoneNo_8000()
{
//这里想得到一些由调用函数传入参数。
}
[ComVisible(true)]
public sealed class BrowserEventHandler
{
private ElementEventFire fire;
public ElementEventFire Fire
{
set { this.fire = value; }
} [DispId(0)]
public bool Handler()
{
this.fire();
return true;
}
} public delegate void ElementEventFire();由于页面里很多iframe,通过循环进行处理,如果用一个变量,得到的参数往往是最后一个设置的变量值,而不是值,
我想在 定义
void GetPhoneNo_8000()时加上参数,
在 onFocusOutHandler.Fire = new ElementEventFire(GetPhoneNo_8000); 调用时穿进去,请教高手。
其次,onFocusOutHandler.Fire = new ElementEventFire(GetPhoneNo_8000);的时候只是把一个函数传给了onFocusOutHandler.Fire,这里并没有调用函数,根本不需要传参数然后,真正需要传参数的时候是它被显式调用的时候,比如onFocusOutHandler.Fire(yourObject);
题外话,你的BrowserEventHandler里面的Fire要写get方法,否则它没法被调用到
你要显式地调用photo.onfocusout(yourObject);才可以传参数,但前提是photo.onfocusout的类型也要是你定义的这个带参数的delegate。如果这个类型你没法控制,那么就没法传参数了
public delegate void ElementEventFire(参数列表);
这样之后,想传几个参数就可以传几个参数了当然,你定义的方法签名也得跟这个委托一致void GetPhoneNo_8000(参数列表);//这里的参数列表跟上面一致onFocusOutHandler.Fire = new ElementEventFire(GetPhoneNo_8000);
或者
onFocusOutHandler.Fire = GetPhoneNo_8000;
我对这个事件有些晕,你看就我上面给你的代码应该如何改才可以传入参数?我你该你了说的几个地方。但是photo.onfocusout没有Fire(yourObject)属性可用,
直接 onFocusOutHandler.Fire2(参数),能传参数,但是不受 photo.onfocusout 控制,页面打开就直接被调用 GetPhoneNo_8000 方法。我如何 photo.onfocusout 中调用 GetPhoneNo_8000 并能带参数。
请就上面的代码给个实例谢谢。
从你的BrowserEventHandler的定义来猜,你的函数调用大概是想在public bool Handler()
{
this.fire();
return true;
}里面调用,你要传参数也要在这里传参数
比如public bool Handler(object yourObject)
{
this.fire(yourObject);
return true;
}
public delegate void ElementEventFire(参数列表);
这样之后,想传几个参数就可以传几个参数了当然,你定义的方法签名也得跟这个委托一致void GetPhoneNo_8000(参数列表);//这里的参数列表跟上面一致”
我都设置为了,但是在调用的时候又有新问题,
1,
onFocusOutHandler.Fire2 = new ElementEventFire2(GetPhoneNo_8001);
onFocusOutHandler.Fire2("ddddd");
时不受 photo.onfocusout 控制,页面打开就执行了。
2,
onFocusOutHandler.Fire2 = new ElementEventFire2(GetPhoneNo_8001);
photo.onfocusout = onFocusOutHandler;
这样用什么都不提示了
void GetPhoneNo_8001(object ss)
{
if (ss == null)
{ MessageBox.Show("null"); }
else
{
MessageBox.Show(ss.ToString());
} }
我现在改成这样了/// <summary>
/// BrowserEventHandler 的摘要说明。
/// </summary>
[ComVisible(true)]
public sealed class BrowserEventHandler
{
private ElementEventFire fire;
private ElementEventFire2 fire2;
public ElementEventFire Fire
{
set { this.fire = value; }
get { return fire; }
}
public ElementEventFire2 Fire2
{
set { this.fire2 = value; }
get { return fire2; }
}
[DispId(0)]
public bool Handler(object s)
{
this.fire(); // 这里写成 this.fire(s) 会报错。
return true;
}
} public delegate void ElementEventFire();
public delegate void ElementEventFire2(string ss);
你好 能给个qq或 msn 吗,我在里面你看代码,谢谢。
我是在axWebBrowser控制网页,但是网页里有很多iframe,我又要控制 iframe里的网页,
所以就要分析iframe页面里的元素,对元素进行控制,
比如,iframe里的页面有个 input 输入框,当输入完后输入框失去焦点,我要得到他输入的内容,这样就用到了上面的代码,在输入完后触发调用一个方法,我给这个方法传入一些参数进去,才能分析出是哪个iframe里的页面输入的值。
...
this.fire(); // 这里写成 this.fire(s) 会报错。
...
这里要用this.fire2(s);我觉得最重要的问题是找到哪里调用的Handler...