如题,我按照http://live.aulddays.com/tech/08/chtmlviewmouse/上的方法,现在能捕获到HtmlView中Document的事件,但是却无法捕获frame中鼠标的事件消息。我尝试在OnMouseMove中判断当前事件元素的标签,如果是frame/ifream就获取其IHTMLDocument2接口,然后为IHTMLDocument2注册事件通知。如下:void CDocEvtHandler::OnMouseMove(MSHTML::IHTMLEventObjPtr pEvtObj)
{
MSHTML::IHTMLElementPtr pElement = pEvtObj->GetsrcElement(); // 事件发生的对象元素

//为Frame的所在文档设置鼠标事件
_bstr_t bstrTagName = pEvtObj->srcElement->tagName;
if (!CompareBSTRNoCase(bstrTagName, _T("frame")) || !CompareBSTRNoCase(bstrTagName, _T("iframe")))
{//这个地方不会进来
IHTMLDocument2 *pDoc2 = NULL;
CComQIPtr<IHTMLElement> pElem;
pElement->QueryInterface(IID_IHTMLElement, (void**)&pElem);
HRESULT hr = GetFrameDocument(pElem, pDoc2);
if (SUCCEEDED(hr))
{
m_pMgr->UninstallEventHandler();
m_pMgr->InstallEventHandler(pDoc2); pDoc2->Release();
}
} //...
}HRESULT CDocEvtHandler::GetFrameDocument(IHTMLElement *pFrameElem, IHTMLDocument2 *&pDoc2)
{
CComQIPtr<IHTMLFrameBase2> pFrameBase2;
HRESULT hr= pFrameElem->QueryInterface(IID_IHTMLFrameBase2,(void**)&pFrameBase2);

/*获得html中鼠标下的元素:
1、 首先拿到IHTMLDocument2接口
2、拿到鼠标的位置GetCursorPos(&pt)
3、IHTMLDocument2的函数elementFromPoint可以拿到位置下的一个IHTMLElement
4、如果在Frame中可以从IHTMLDocument2拿到IDisplayServices接口
5、在IDisplayServices接口中TransformPoint可以转换鼠标的相对于frame的值
*/ if (SUCCEEDED(hr))
{
CComQIPtr<IHTMLWindow2> pWindow2;
hr = pFrameBase2->get_contentWindow(&pWindow2);
if (SUCCEEDED(hr))
{
//释放旧的文档资源
if (NULL != pDoc2) pDoc2->Release(); hr = pWindow2->get_document(&pDoc2);

} return hr;
}希望高手指点,非常感谢!

解决方案 »

  1.   

    我要处理的是像百度登陆这样的情况,即frame覆盖到document上了,如下图:
      

  2.   

    自己搞定了,哈哈。
    我现在改用通过获取鼠标光标的位置,然后调用IHTMLDocument2的elementFromPoint来获取鼠标悬停的元素。遇到是frame的情况,就先获取frame的IHTMLDocument2接口,然后将点转换为相对于frame的坐标再通过其IHTMLDocument2接口调用elementFromPoint即可。结贴喽~