Activex感知网页刷新关闭事件
原因
大多数ActiveX控件框架,例如MFC和ATL,在本地激活ActiveX控件时创建控件。基于性能上的考虑,直到控件第一次可见的时候,IE才本地激活ActiveX控件。这样包含ActiveX控件的网页载入更加迅速,占用内存更少。这也使得ActiveX控件的WM_CREATE处理代码直到控件第一次可见的时候才被调用。
如果控件支持非窗口激活,那么IE会以非窗口激活方式创建控件,这样在离开或者关闭页面的时候控件的WM_DESTORY处理代码不会被调用。
解决方案
IE在初始化或者退出页面的时候会调用页面中的ActiveX控件的IOleObject::SetClientSite的实现,无论控件是否被本地激活。在初始化页面的时候,传递的指针是宿主的IOleClientSite 接口指针,在离开或者关闭页面的时候,传递的指针是空指针。可以根据这个指针来判断控件的状态,并且执行初始化或者清除的代码。
MFC MFC对IOleObject::SetClientSite()的实现包含对虚函数COleControl::OnSetClientSite()的调用。这时候可以根据m_pClientSite是否为空指针来判断控件是被加载还是被清除。 // CMyControl 派生于COleControl.
void CMyControl::OnSetClientSite()
{
if (m_pClientSite)
//父窗口及其大小并不重要,因为控件在本地激活时会自动重画和重新定位。
VERIFY (CreateControlWindow (::GetDesktopWindow(), CRect(,,,), CRect(,,,)));
else
DestroyWindow();
COleControl::OnSetClientSite();
} ATL ATL对IOleObject::SetClientSite()的实现有一个IOleClientSite类型的参数(MFC在对IOleObject::SetClientSite()的实现中保存这个指针到COleControl::m_pClientSite),直接拿来判断就行了。同时,ATL没有重新设置控件的父窗口,所以控件需要手动进行本地激活。 // CMyControl 派生于CComControl
STDMETHOD(SetClientSite)(IOleClientSite *pClientSite)
{
if (pClientSite)
{
RECT rc = {,,,};
// Don't have access to the Container's window so just use the
// desktop. Window will be resized correctly during in-place
// activation.
HWND hWnd = CreateControlWindow(::GetDesktopWindow(), rc);
_ASSERT (hWnd);
}
else
::DestroyWindow(m_hWnd);
return IOleObjectImpl::SetClientSite (pClientSite);
} HRESULT InPlaceActivate(LONG iVerb, const RECT* prcPosRect)
{
// Get the container's window. _ASSERT (m_spClientSite);
LPOLEINPLACESITE pInPlaceSite = NULL;
HRESULT hr = m_spClientSite->QueryInterface(IID_IOleInPlaceSite, (void **)&pInPlaceSite);
_ASSERT (SUCCEEDED (hr) && pInPlaceSite);
HWND hParent = NULL;
hr = pInPlaceSite->GetWindow (&hParent);
_ASSERT (SUCCEEDED (hr) && hParent);
pInPlaceSite->Release ();
// Set container window as our parent window
SetParent (hParent); < BR > return CComControlBase::InPlaceActivate(iVerb, prcPosRect); < BR >
}
---------------------------------
http://blog.csdn.net/flyingroc0209/article/details/51036113
Activex感知网页刷新关闭事件的更多相关文章
- ocx控件针对网页刷新和关闭分别进行区分处理
当ocx加载在网页上时,如果对网页执行F5刷新事件,ocx控件会销毁ocx的窗口类,但是ocx的APP类是不会销毁的. 只有当网页被关闭时,才销毁app类. --------------------- ...
- layer.open参数;layer.open关闭事件;layer.open关闭刷新;layer.open获取子页的值;layer.open调用子页面的方法
父页面 function layerOpen() { layer.open({ type: 2, shade: [0], title: "验收申请", area: ['1024px ...
- Python-webbrowser实现自动打开关、定时打开关闭网页/刷新网页
webbrowser- 方便的Web浏览器控制器,是Python一个模块,可实现自动打开关.定时打开关闭网页/刷新网页,在Unix下,图形浏览器在X11下更受欢迎,但如果图形浏览器不可用或X11显示器 ...
- 关于在SharePoint2013中弹出模态化窗口的问题及关闭事件。
js: /*弹出对话框方法开始*//** 弹窗方法(需要回传值时,自定义回调方法)* @url: 弹出窗口页面url* @width: 宽度* @height: 高度* @callback: 回调函数 ...
- WPF:Webbrowser 捕获关闭事件
有点难描述说的是什么.大概就是下面这个图:窗体中嵌套一个Webbrowser,现在网页请求关闭 响应MessageHook事件: this.webBrowser.MessageHook += webB ...
- javascript捕获页面窗口关闭事件
javascript捕获窗口关闭事件有两种方法 onbeforeunload() ,onUnload() 用法有两种: 1. function window.onbefore ...
- ASP.NET网页生命周期事件
网页事件 典型的使用方式 PreInit PreInit事件是网页生命周期中非常早起的一个事件,在PreInit事件触发之后,就会加载用户设置信息与网页主题.我们通常使用PreInit事件来执行下列处 ...
- js关闭浏览器窗口及检查浏览器关闭事件
js关闭浏览器窗口,不弹出提示框.支持ie6+,火狐,谷歌等浏览器,下面以一个示例为大家详细介绍下具体的实现方法,感兴趣的朋友可以参考下 js关闭浏览器窗口 js关闭浏览器窗口,不弹出提示框.支持 ...
- WPF下如何去除WebBrowser的滚动条和捕获关闭事件
方法一:适用于VS2008 1.在解决方案中添加“引用” 选择 COM 下的 Microsoft html object library 2.引入命名空间 using mshtml; ...
随机推荐
- TI IPNC Web网页之GoDB开发环境
介绍 下面介绍DM8127/DM385 IPNC RDK中网页制作相关的东东. 具体来说,各位获得这个RDK包时有以下文件: IPNC_RDK_DM812x_DM385_Version3.5.0.ta ...
- 静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化.而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺诡异的,如下所示. /** ...
- 2——FFMPEG之协议(文件)操作----AVIOContext, URLContext, URLProtocol
协议操作对象结构: 协议(文件)操作的顶层结构是AVIOContext,这个对象实现了带缓冲的读写操作:FFMPEG的输入对象AVFormat的pb字段指向一个AVIOContext. AVIOCon ...
- [置顶]
Xposed也要热更新
好久没写博客了.这次玩一点不一样的. 吐槽&起因 相信熟悉Xposed的小伙伴们都知道,每次写完Xposed都要重启啊!有木有!反射错了,写错了名字,改一个log,都要重启啊有木有!重启浪费时 ...
- 微信小程序如何在使用wx.request使用cookie
我主要是做asp.net mvc后端开发的,经常使用Jquery的ajax与后台的Web API进行数据交互. 最近公司要做一个小程序,要实现小程序与Web前端的通信,当然小程序是可以实现socket ...
- Go语言开发中MongoDB数据库
伴随着移动端的兴起,Nosql数据库以其分布式设计和高性能等特点得到了广泛的应该用,下面将介绍下Nosql中的mongoDB在Go语言中的应用,在开发前,有必要了解下基础知识 在开发前,导入开发需要用 ...
- python学习之模块&包的引用
名词解释: 模块:一个程序文件 包:相当于一个类库,打包发布后相当于c#中的dll, 包中可包括若干个模块,比如main.py就是一个模块,对于test2文件下的所有模块组成一个包 对于一个包而言,注 ...
- cnn(卷积神经网络)比较系统的讲解
本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之 ...
- 选择第n大的数(分治法和排列实现)
个人心得:在买的书上看到的一个经典分治题,题目意思就是给定一个数组,求第k小的数. 第一反应就是排序,然后返回第k-1位置的数就可以了,这样算法的复杂度是nlongn,在快速排序的基础下还是挺不错的. ...
- Webpack-dashboard 简单使用
1. 安装 npm install webpack-dashboard --save-dev 2. 配置说明 webpack config // Import the plugin: var Dash ...