2008年5月26日 星期一

開發 IE 瀏覽器的 Toolbar:監聽按鈕 onclick 事件

開發 IE 瀏覽器的 Toolbar,繼續研究如何在 IE Toolbar 監聽 html element 的事件處理。參考了以下文章:

http://blog.monstuff.com/archives/000052.html

若是在 html 中的按鈕寫法為:


<button id="b1">click me</button>


則在 C# 中,可以用以下寫法來監聽 onclick 事件:


private void button5_Click(object sender, System.EventArgs e)
{
IWebBrowser2 webBrowser = (IWebBrowser2)this.Explorer;
IHTMLDocument2 document = (IHTMLDocument2)webBrowser.Document;

HTMLButtonElement b1 = (HTMLButtonElement)document.all.item("b1", null);
((HTMLButtonElementEvents2_Event)b1).onclick += new HTMLButtonElementEvents2_onclickEventHandler(this.btn_onclick);
}

private bool btn_onclick(IHTMLEventObj e)
{
MessageBox.Show("click me!!");
return true;
}


可是,針對另一種比較常見的寫法,我就找不到如何監聽了:


<form name="f3">
<input name="btnSubmit" type="submit" value="test">
</form>


如果我的 C# 寫成:



private void button5_Click(object sender, System.EventArgs e)
{
IWebBrowser2 webBrowser = (IWebBrowser2)this.Explorer;
IHTMLDocument2 document = (IHTMLDocument2)webBrowser.Document;

HTMLButtonElement b2 = (HTMLButtonElement)document.all.item("btnSubmit", null);
((HTMLButtonElementEvents2_Event)b2).onclick += new HTMLButtonElementEvents2_onclickEventHandler(this.btn_onclick);
}

private bool btn_onclick(IHTMLEventObj e)
{
MessageBox.Show("click me!!");
return true;
}


則會看到錯誤訊息是無法將 HTMLInputElementClass 轉成 HTMLButtonElementEvents2_Event:



但是,mshtml 中又沒有 mshtml.HTMLInputElementEvents2_Event 或 mshtml.HTMLInputButtonElementEvents2_Event,也沒有對應的 mshtml.HTMLInputElementEvents2_onsubmitEventHandler 與 mshtml.HTMLInputButtonElementEvents2_onsubmitEventHandler,所以我找不出該如何舉一反三。

若是改由 form 的 onsubmit 下手的話,程式碼為:


private void button5_Click(object sender, System.EventArgs e)
{
IWebBrowser2 webBrowser = (IWebBrowser2)this.Explorer;
IHTMLDocument2 document = (IHTMLDocument2)webBrowser.Document;

mshtml.HTMLFormElementClass f3 = document.all.item("f3", null) as HTMLFormElementClass;
((mshtml.HTMLFormElementEvents2_Event)f3).onsubmit += new mshtml.HTMLFormElementEvents2_onsubmitEventHandler(btn_onclick);
}

private bool btn_onclick(IHTMLEventObj e)
{
MessageBox.Show("click me!!");
return true;
}


結果測試時,竟然一點反應也沒有,在指派 event handler 時沒有錯誤訊息,但是按下 form 中的 submit button 時也沒任何反應,form 也不會送出,看來這之中還有一些複雜的原因。

繼續研究看看~

========================================

[2008-05-26-17-42]

參考這篇文章:

Handling HTML Events from .NET, using C#
http://www.codeproject.com/KB/dotnet/NetHtmlEventHandler.aspx

使用作者提供的 HtmlEventProxy.cs 檔,然後修改我的 C# 程式碼如下:


private void button5_Click(object sender, System.EventArgs e)
{
IWebBrowser2 webBrowser = (IWebBrowser2)this.Explorer;
IHTMLDocument2 document = (IHTMLDocument2)webBrowser.Document;

HTMLButtonElement b1 = (HTMLButtonElement)document.all.item("b1", null);
((HTMLButtonElementEvents2_Event)b1).onclick += new HTMLButtonElementEvents2_onclickEventHandler(this.btn_onclick);



HTMLButtonElement btnSubmit = document.all.item("btnSubmit", null) as HTMLButtonElement;
HtmlEventProxy.Create("onclick", btnSubmit, new System.EventHandler(this.evtHandler));

HTMLFormElement f3 = document.all.item("f3", null) as HTMLFormElement;
HtmlEventProxy.Create("onsubmit", f3, new System.EventHandler(this.evtHandler));
}

private bool btn_onclick(IHTMLEventObj e)
{
MessageBox.Show("click me!!");
return true;
}

private void evtHandler(object sender, EventArgs e)
{
IHTMLElement element = ((HtmlEventProxy)sender).HTMLElement as IHTMLElement;
MessageBox.Show(element.outerHTML);

((HtmlEventProxy)sender).Detach();
}


html 網頁的部份:


<button id="b1">click me</button>

<form name="f3">
<input name="btnSubmit" type="submit" value="test">
</form>


執行時,當按下工具列第五個按鈕後,便會透過 HtmlEventProxy 為 form f3 的 onsubmit 加上監聽程式,也為 form 中的 "btnSubmit" submit button 加上監聽程式,然後再去按下 html 中的 text 按鈕時,將會跳出兩次訊息,執行畫面如下:



沒有留言: