我正在我的webbrowser控件中加载一个页面&当点击一个锚元素时,我需要在我的控制中捕获一个事件。
我想要做的是在链接打开网页对话框之前执行一段代码。
这是网页上的元素
<a id="saveExpression" href="#end-result" class="BuilderToolBar Save" title="Save Expression"><span class="displace"></span></a>
到目前为止,我已尝试过几件事。
IServiceProvider serviceProvider = (IServiceProvider)_webBrowserCtrl.Document;
Guid serviceGuid = SID_SWebBrowserApp;
Guid iid = typeof(SHDocVw.IWebBrowser2).GUID;
SHDocVw.IWebBrowser2 myWebBrowser2 = (SHDocVw.IWebBrowser2)serviceProvider.QueryService(ref serviceGuid, ref iid);
SHDocVw.DWebBrowserEvents_Event wbEvents = (SHDocVw.DWebBrowserEvents_Event)myWebBrowser2;
wbEvents.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler(OnWebBrowserNewWindow);
上述内容似乎仅在存在“NewWindow”时触发,但链接会打开一些网页对话框。
我也试过
mshtml.HTMLDocument doc;
doc = (mshtml.HTMLDocument)myWebBrowser2.Document;
mshtml.HTMLDocumentEvents2_Event iEvent;
iEvent = (mshtml.HTMLDocumentEvents2_Event)doc;
iEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(iEvent_onclick);
bool iEvent_onclick(IHTMLEventObj pEvtObj)
{
// Code before the webpage dialog box is opened.
return true;
}
这会捕获每个'onclick'事件,但随后会失去点击事件实际执行的操作的方向。
我想要做的就是在按钮打开网页对话框之前捕获一个特定按钮的单击,执行操作。我可以通过onclick实现这一点,但它不会继续打开对话框,页面也有一个'textarea',当触发onclick事件时会失去焦点。
<textarea name="ctl00$contentForExpressions$txtExpression" id="ctl00_contentForExpressions_txtExpression" onkeyup="commonUi.getPosition(event);expressionCurrentState.updateStatusFlag();" onmouseup="commonUi.getPosition(event)" onpaste="return commonUi.maxLengthPaste(this,"160");" class="expressionBuilderTextbox" onchange="expressionCurrentState.updateStatusFlag()" onfocus="commonUi.disableToolItems()" type="text" onkeypress="commonUi.disableToolItems(this);" onmousedown="commonUi.getPosition(event)"></textarea>
是否有更简洁或更简单的方法来实现这一目标?或者我错过了什么?
答案 0 :(得分:3)
只要你在iEvent_onclick中返回true,它就应该进一步处理事件。无论如何,我的工作解决方案是:
private bool iEvent_onclick(IHTMLEventObj pEvtObj)
{
if (pEvtObj.srcElement != null)
{
var parent = pEvtObj.srcElement.parentElement;
if (parent != null && parent.id == "saveExpression")
{
MessageBox.Show("Bingo!");
return false;
}
}
return true;
}