activex嵌入浏览器时线程触发事件

简介: 8 推荐在浏览器中嵌入activex后,线程中触发的事件就没有动静了,如果在调试的情况下,还能发现浏览器有非法错发生。而同样的activex如果使用应用程序来调用则正常。解决方法是取巧的方式,在线程中发出消息,控件响应消息后再FireEvent。
 
8
在浏览器中嵌入activex后,线程中触发的事件就没有动静了,如果在调试的情况下,还能发现浏览器有非法错发生。而同样的activex如果使用应用程序来调用则正常。

解决方法是取巧的方式,在线程中发出消息,控件响应消息后再FireEvent。

1. 创建控件项目。
2. 类向导, 使用 Add 方法将启动二线程并返回。 下面的代码显示方法启动二线程并立即返回 MFCActiveX 控件中。 全局函数以作为二线程工作函数还声明:
   LONG ThreadProc(LPVOID pParam);

void CFireeventCtrl::StartLengthyProcess()
{
DWORD dwID;
HANDLE threadHandle = CreateThread(NULL,NULL,
(LPTHREAD_START_ROUTINE)ThreadProc,
(LPVOID)this, NULL, &dwID);
TRACE("Started the thread %x\n",dwID);
}
3. 添加任何要从使用类向导二线程激发事件。
4. 定义要从二线程发送自定义邮件。 还, 将消息映射项添加到控件消息映射接收自定义消息时, 将调用消息处理函数。 此消息处理程序将触发需事件。 样本如何执行此 MFCActiveX 控件中的如下:
      //define a custom message:
#define WM_THREADFIREEVENT WM_APP+101

//add an entry for the message to the message map of the control
BEGIN_MESSAGE_MAP(CFireeventCtrl, COleControl)
//{{AFX_MSG_MAP(CFireeventCtrl)
//}}AFX_MSG_MAP
ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
ON_MESSAGE(WM_THREADFIREEVENT,OnFireEventForThread) //custom handler
END_MESSAGE_MAP()

//add a handler for the custom message that will fire our event
LRESULT CFireeventCtrl::OnFireEventForThread(WPARAM wParam,
LPARAM lParam)
{
FireLengthyProcessDone();
return TRUE;
}
5. 为二线程, 线程过程中当是二线程来触发事件, 时间张贴回主线程步骤 3 中定义自定义消息。 激发事件。 以下代码演示:
      LONG ThreadProc(LPVOID pParam)
{
Sleep(2000); //simulate lengthy processing
CFireeventCtrl *pCtrl = (CFireeventCtrl*)pParam;
PostMessage(pCtrl->m_hWnd,
WM_THREADFIREEVENT,
(WPARAM)NULL,
(LPARAM)NULL);
return TRUE;
}

同时因为浏览器貌似并不创建activex的窗口,所以还要增加创建窗口的代码。
MFC 提供函数调用 COleControl::CreateControlWindow() 来创建控件窗口。 MFC 实现 IOleObject::SetClientSite() 调用 COleControl::OnSetClientSite()。 将以下到 - COleControl 派生类:
   // CMyControl is derived from COleControl.
void CMyControl::OnSetClientSite()
{
if (m_pClientSite)
// It doesn't matter who the parent window is or what the size of
// the window is because the control's window will be reparented
// and resized correctly later when it's in-place activated.
VERIFY (CreateControlWindow (::GetDesktopWindow(), CRect(0,0,0,0),
CRect(0,0,0,0)));
COleControl::OnSetClientSite();
}
参考:
http://topic.csdn.net/t/20040109/17/2650433.html#
http://support.microsoft.com/kb/195188/zh-cn
http://support.microsoft.com/kb/157437
目录
相关文章
|
3月前
|
JavaScript 开发者
什么是浏览器环境下事件的 Propagation
什么是浏览器环境下事件的 Propagation
49 1
|
4月前
|
Web App开发 前端开发
Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析
Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析
162 0
|
2月前
|
JavaScript 前端开发
js阻止浏览器默认事件和防止事件传播事件
js阻止浏览器默认事件和防止事件传播事件
22 3
|
3月前
|
JavaScript 开发者
什么是浏览器环境下的 Event Propagation(事件传播)
什么是浏览器环境下的 Event Propagation(事件传播)
18 1
|
4月前
|
存储 JSON 运维
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
54 0
|
9月前
|
前端开发
前端学习笔记202306学习笔记第四十三天-浏览器事件环
前端学习笔记202306学习笔记第四十三天-浏览器事件环
44 0
|
5月前
|
Web App开发 移动开发 JavaScript
【Vue版】实现拖拽、排序效果(注意,这个方法在chrome谷歌浏览器上面不适用,dragend会情不自禁触发drag事件先执行,有点像浏览器的一个bug)
【Vue版】实现拖拽、排序效果(注意,这个方法在chrome谷歌浏览器上面不适用,dragend会情不自禁触发drag事件先执行,有点像浏览器的一个bug)
|
6月前
|
JavaScript 前端开发 UED
什么是事件冒泡?如何阻止事件冒泡和浏览器默认事件?
什么是事件冒泡?如何阻止事件冒泡和浏览器默认事件?
112 0
|
9月前
|
JavaScript 前端开发 Java
【JCEF】SWT嵌入浏览器(包含VUE的)
【JCEF】SWT嵌入浏览器(包含VUE的)
145 1
|
9月前
|
前端开发
前端学习笔记202306学习笔记第四十三天-浏览器事件环3
前端学习笔记202306学习笔记第四十三天-浏览器事件环3
34 0

热门文章

最新文章