请教基于SDK的iwebbrowser2 事件控件如何屏蔽新窗口打开链接

&&&&IWebBrowser2控件去除边框
IWebBrowser2控件去除边框
微软的drillerMFC源码。
可以去除IWebBrowser2边框。
另附网络上其他人总结的使用方法http://blog.csdn.net/tangyin025/article/details/8675513
请参考文章与源码自行使用。
若举报审核通过,可奖励20下载分
被举报人:
leadtheway
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行关于几个HTML文档接口的使用探讨
核心提示:问题:在使用Active Accessibility SDK的过程中,我从某个窗口的句柄来获得IHTMLDocument2指针,关于几个HTML文档接口的使用探讨,有没有什么方法可以从IHTMLDocument2指针来获得IWebBrowser2指针?我用QueryInterface在两个接口(IHTMLDocumen
问题:在使用Active Accessibility SDK的过程中,我从某个窗口的句柄来获得IHTMLDocument2指针。有没有什么方法可以从IHTMLDocument2指针来获得IWebBrowser2指针?我用QueryInterface在两个接口(IHTMLDocument2 和 IWebBrowser2)上试过,但没有成功。我也用网景(Netscape)的 HTMLWindow2 指针试过从get_navigator获取IOmNavigator *。也以失败告终。请高手指点。解答:这个问题通常是COM编程中存在的共性问题。你有了窗口,文档,或者浏览器,你明明知道可以通过这些已知数据来得到其它的信息,但往往在实际环境中一运行,QueryInterface总是给你送回一个肥大的NULL。这个问题的答案实际上隐藏在神秘的IServiceProvider接口中,顾名思义,IServiceProvider的作用就是提供服务。IServiceProvider是个非常棒的接口:它只有一个方法&&QueryService。如果你会用ATL智能指针,就像下面这样。首先必须获得IServiceProvider接口,CComQIPtr isp = pIHTMLDocument2;这行代码实际上就是对文档执行了一次 QueryInterface,以询问IServiceProvider接口。一旦具备了isp,你便可以象下面这样获得浏览器。CComQIPtr iwb2;isp-&QueryService(IID_IWebBrowserApp,IID_IWebBrowser2, (void**)&iwb2);如果你还是不明白上面所讲东西,没有关系,很正常。COM编程的一个根本规则是:QueryInterface必须总是要返回所查询对象的接口。但是文档不实现 IWebBrowser2 接口,它只知道如何获得正在工作的对象。文档,浏览器和窗口都是独立的对象。通常IServiceProvider被用于多个单独且相关的COM对象群来实现某种类型的服务。QueryInterface询问某个对象:&你实现这个接口吗?&,而QueryService告诉某个服务提供者,&不管什么对象实现这个接口都要告诉我。& 使用QueryService返回的接口指针与所查询的对象可能相同,也可能不相同。如图一所示。所有对象都实现它们自己不同的接口并在内部存储指向另一个对象的指针。你必须用IServiceProvider接口来获得特定接口的对象,不论它是哪一个对象实现的。IServiceProvider::QueryService要追随这些内部指针来获取实现你所想要的接口对象。图一 多个对象,一个IServiceProvider从本质上讲,IServiceProvider用于导航DHTML对象层次。假设你正在写一个ActiveX控件来导航这个对象模型。你如何做呢?首先要像下面这样查询IOleClientSite来取得IServiceProvider:CComQIPtr isp = pS然后,一旦你具备了IServiceProvider,则可以用QueryService来从中查询应用对象。CComQIPisp-&QueryService(IID_IWebBrowserApp, IID_IWebBrowserApp, (void **)&iwba);接下来你就可以导航这个对象层次了(应用对象在最顶层)。如果你想要得到Web浏览器,那么与前面类似。CComQIPtr iwb2;isp-&QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void **)&iwb2));在所有这些例子中,SID_SWebBrowserApp都是服务标示,但你也能常常见到将IID_IWebBrowserApp作为服务ID的代码。两种用法都可以行得通,因为文件中有个宏定义:#defines SID_SWebBrowserApp IID_IWebBrowserApp但从编程的角度上讲,SID_SWebBrowserApp在技术上更正确,并且对阅读代码的人来说也更清晰。此外,如果你有足够的勇气去实现像DHTML对象模型这类庞大的对象系统的话,你也要用到IServiceProvider接口...... 关于这个问题的解答我也只能浅尝辄止地说明到这个地步,再往深处走,我也蒙嚓嚓。更深层次的探讨请各位参见MSDN库。由于个人水平所限,对解答中存在的错误与不详之处,请各位弟兄海涵。
赞助商链接如何监听WPF的WebBrowser控件弹出新窗口的事件_百度知道
如何监听WPF的WebBrowser控件弹出新窗口的事件
提问者采纳
.cookie = new AxHost.;)。如此.,默认情况下.ReflectGetProperty(&quot, UnsafeNativeMethods.BindingFlags.DWebBrowserEvents2))....
public void NewWindow2(ref object pDisp,这个WPF的WebBrowserEvent。仔细搜索一遍,我们会发现它跟Winform的WebBrowser机制是一样的。代码就不贴上来了..webBrowserE【效果图】初始网页,在新建一个Tab来打开.}仍然是一个WebBrowserEventWPF中自带一个WebBrowser控件,我们WPF一定也有办法加上,是谁调用了这个OnNewWindow呢..webBrowserE
public WebBrowserEvent(WebBrowserHelper helperInstance)
_helperInstance = helperInstance.DWebBrowserEvents2)),
CultureInfo,那我们就请出神器Reflector.DWebBrowserEvents2)).,
ReflectionService.Assembly..,并没有触发NewWindowEvent, webBrowserEvent.DWebBrowserEvents2{
.None)]internal class WebBrowserEvent 。首先。首先,例如,
new[] { axIWebBrowser2,Winform能加上的:代码private void Attach(){
var axIWebBrowser2 = _webBrowser: 代码[SecurityCritical]internal virtual object CreateEventSink(){
return new WebBrowserEvent(this,这个我们直接通过Reflector复制一份就好了, typeof(UnsafeNativeMethods, SecurityCritical]internal override void CreateSink(){
this,或者控制它在当前WebBrowser中跳转..parent: InternalDispatchObject&lt, this。一个似曾相识的CreateSink方法映入眼中.ConnectionPointCookie&
.,WPF的WebBrowser没有这个事件., this: 代码protected override void CreateSink(){
object activeXInstance = base.;
this...AllowNavigation = this,现在是在新的Tab中打开..AllowNavigation,研究一把;
_cookie = Activator.} 实际上,这其实是一个COM类型的定义.:“将一个ActiveX 控件连接到处理该控件的事件的客户端”.CAxIWebBrowser2&quot,在这个事件中做一些处理.ConnectionPointCookie(activeXInstance.InterfaceIsIDispatch).webBrowserEvent..._webBrowser).,上面这句话不难理解! 既然微软的童鞋不写._axIWebBrowser2.NewWindow(this,就是定义一个实现了特定COM接口的类型;
var webBrowserEvent = new WebBrowserEvent(this);34A715A0--924A-0020AFC7AC4D&quot, TypeLibType(TypeLibTypeFlags。很不幸的是, ref bool cancel){}现在知道为什么WPF的WB控件没有NewWindow事件了吧: public void NewWindow2(ref object ppDisp,我们再去看WebBrowserEvent的定义;很显然.Internal,_hostingAdapter:
protected virtual void OnNewWindow(CancelEventArgs e)
if (this.webBrowserHelper.GetType(&quot,但是它的访问权限是internal的.CurrentUICulture)..
} 最后.ConnectionPointCookie(activeXInstance,那我们就来研究一下定义这个方法的WebBrowserE.OnNewWindow(ref cancel),将是弹出一个IE窗口..,它恰恰是实现了这个接口的,因此。AxHost,最后在一个叫WebBrowserEvent的类里面发现这么一段。 上面的调用中有一个很奇怪的类型。说到底,熟悉COM的童鞋应该马上能想到;}这儿也有一个ConnectionPointCookie: public void NewWindow2(ref object ppDisp: 代码[SecurityTreatAsSafe,NewWindow2其实是浏览器控件去调用的,用了反射来取WebBrowser内部的东东._cookie = new ConnectionPointCookie(this, ref bool cancel)
_helperInstance,
null.ConnectionPointCookie类的作用是;}最后的使用.,我们打开Winform的WebBrowser?接着搜索,看看是谁在使用它;
cancel = e,找到触发NewWindow事件的代码;
}}注意这句话, this:代码public partial class WebBrowserHelper
private class WebBrowserEvent : this,谁让这些类型都是internal的呢)。 [ClassInterface(ClassInterfaceType,让浏览器控件的事件能够转发到这个类型实例去处理;):点击一个链接。因此: StandardOleMarshalObject?微软的童鞋压根儿就没写.DWebBrowserEvents2{
!悲剧的是。 Winform的WebBrowser我们搞清楚了,下面我们来看WPF的.CreateInstance(
cookieType._hostingAdaptor。代码[ComImport.Cancel,那我们就自己折腾一把,我们再仿造一个WebBrowserEvent, typeof(UnsafeNativeMethods,也来CreateSink一把(我承认,我们也得定义一个DWebBrowserEvents2接口。那么,反正原理已经搞清楚了,我们需要仿造Framework中的代码;}[ClassInterface(ClassInterfaceType.FHidden).CreateEventSink(),例如百度;, UnsafeNativeMethods..。既然从方法入手没找到,那么它会生生的弹出一个IE窗口来!= null)
var cookieType = typeof(WebBrowser);
}它是在OnNewWindow方法中触发的:DWebBrowserEvents2, ref bool cancel){
CancelEventArgs e = new CancelEventArgs(),Winform的WB或者是WPF的WB都是在调用IE的一个控件,打开WPF的WebBrowser代码之后;MS。接着,如果这个链接是会弹出一个新窗口的,这句话是关键, typeof(UnsafeNativeMethods.NewW}我们接着搜NewWindow2, Guid(&quot..DWebBrowserEvents2&gt.webBrowserEvent = new WebBrowserEvent(this);UnsafeNativeMethods,当我们使用它打开一个网页, typeof(DWebBrowserEvents2) }.}因此:(第二个参数,最后发现在WebBrowser的CreateSink方法中有这么一段;
if (activeXInstance ,关键是要触发NewWindow事件,我们可以监听它的NewWindow事件..None)]private class WebBrowserEvent .NewWindow += WebBrowserOnNewW
this。 如果使用Winform的WebBrowser控件, InterfaceType(ComInterfaceT
this.CreateEventSink返回的是什么呢!= null)
this。其实.OnNewWindow(e),却发现没有地方显式地调用它了,然后点击它其中的链接时, e): StandardOleMarshalO)]public interface DWebBrowserEvents2{
, DWebBrowserEvents2
private WebBrowserHelper _helperInstance = null.activeXInstance,而不是在内部跳到该链接.cookie = new AxHost: var webBrowserHelper = new WebBrowserHelper(webBrowser)
其他类似问题
为您推荐:
wpf的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁求助,关于非MFC环境下如何挂接IWebBrowser2的新窗口事件
[问题点数:100分,结帖人leilidi]
求助,关于非MFC环境下如何挂接IWebBrowser2的新窗口事件
[问题点数:100分,结帖人leilidi]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年9月 VC/MFC大版内专家分月排行榜第一2013年8月 VC/MFC大版内专家分月排行榜第一
2012年2月 VC/MFC大版内专家分月排行榜第二2011年3月 VC/MFC大版内专家分月排行榜第二2011年2月 VC/MFC大版内专家分月排行榜第二
2013年9月 VC/MFC大版内专家分月排行榜第一2013年8月 VC/MFC大版内专家分月排行榜第一
2012年2月 VC/MFC大版内专家分月排行榜第二2011年3月 VC/MFC大版内专家分月排行榜第二2011年2月 VC/MFC大版内专家分月排行榜第二
2013年9月 VC/MFC大版内专家分月排行榜第一2013年8月 VC/MFC大版内专家分月排行榜第一
2012年2月 VC/MFC大版内专家分月排行榜第二2011年3月 VC/MFC大版内专家分月排行榜第二2011年2月 VC/MFC大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。查看: 5744|回复: 3
关于IWebBrowser2**压栈后通过lua_touserdata函数获取异常求解
在Lu中我自定义了一个事件响应函数:
function callJSMethod(self)
& &local tree = self:GetOwner()
& &local LoginWeb = tree:GetUIObject(&mainCenter:Web&)
& &local IWebBrowser2 = LoginWeb:GetRawWebBrowser()
& &XLMessageBox(tostring(IWebBrowser2))
& &--获取全局对象
& &local jsDispatch = XLGetObject(&webpage.dispatch&)
& &--传递参数与IWebBrowser2**进行页面JS调用
& &jsDispatch:invokeMethod(IWebBrowser2, &test&, &param&)
然后在C++的invokeMethod方法z中从通信栈中获取IWebBrowser2** 并转为IDispatch类型,相关函数定义如下:
//被Lua调用的函数定义
int LuaJsDispatch::invokeMethod(lua_State* luaState){
& & & & VARIANT params[10];
& & & & IWebBrowser2** lplpWB = reinterpret_cast&IWebBrowser2**&(lua_touserdata(luaState, 1));
& & & & CComQIPtr&IDispatch& pDispatch = *lplpWB ;& &&&//改行执行的时候报错,读取ox。。。。时发生访问冲突
& & & & LuaJsDispatch::InvokeMethod(pDispatch , L&callTest&, NULL, params, 0);
& & & & return 1;
HRESULT LuaJsDispatch::InvokeMethod(IDispatch *pObj, LPOLESTR pName, VARIANT *pVarResult, VARIANT *p, int cArgs){
& & & & DISPID dispid = FindId(pObj, pName);
& & & & if(dispid == -1){
& & & & & & & & return E_FAIL;
& & & & DISPPARAMS
& & & & ps.cArgs = cA
& & & & ps.rgvarg =
& & & & ps.cNamedArgs = 0;
& & & & ps.rgdispidNamedArgs = NULL;
& & & & return pObj-&Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &ps, pVarResult, NULL, NULL);
请求指导一下下列两行操作是否存在问题,若有,应该如何处理?
IWebBrowser2** lplpWB = reinterpret_cast&IWebBrowser2**&(lua_touserdata(luaState, 1));
CComQIPtr&IDispatch& pDispatch = *lplpWB ;
IWebBrowser2** lplpWB = reinterpret_cast&IWebBrowser2**&(lua_touserdata(luaState, 2));
参数顺序错了,jsDispatch:invokeMethod(xxx) 这样形式调用,第一个参数一般是isdispath的this指针或者类似的参数,第二个才是真正参数,去看下在线文档的教程和sdk里面的class的lua封装,一般都是马虎错
本帖最后由 itlangqun 于
09:49 编辑
感谢!跨过这个bug已经成功实现框架调用页面JS方法。
这个页面与外框相互交互的例子我给一个链接大家可以看看:
参考你的代码还有这边帖子。HRESULT JsDispatch::InvokeMethod(IDispatch *pObj, LPOLESTR pName, VARIANT *pVarResult, VARIANT *p, int cArgs)
{
//执行这行时返回值总是1-
& & & & [color=Red]DISPID dispid = FindId(pObj, pName);[/color]
& & & & if(-1 == dispid) return E_FAIL;
& & & & DISPPARAMS
& & & & ps.cArgs = cA
& & & & ps.rgvarg =
& & & & ps.cNamedArgs = 0;
& & & & ps.rgdispidNamedArgs = NULL;
& & & & return pObj-&Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &ps, pVarResult, NULL, NULL);
}复制代码FindId函数是这样的:DISPID JsDispatch::FindId(IDispatch *pObj, LPOLESTR pName)
{
& & & & DISPID id = 0;
& & & & if(FAILED(pObj-&GetIDsOfNames(IID_NULL,&pName,1,LOCALE_SYSTEM_DEFAULT,&id))) id = -1;
& & & &
}复制代码
Powered by}

我要回帖

更多关于 iwebbrowser 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信