求助:IWebBrowser,浏览器相关: DIID_HTMLElementEvents2,修改鼠标点击事件的信息IHTMLEventObj2;

开心的卡夫卡 2012-11-15 05:02:18
涉及到两个问题:见如下描述。

描述:

1. 继承自CCmdTarget的XXXXSink


class XXXXSink: public CCmdTarget
{
DECLARE_DYNAMIC(XXXXSink)
public:
XXXXSink(CHtmlView *pParentHtmlView = NULL);
virtual ~XXXXSink();
void OnHtmlClick(IHTMLEventObj *pEvtObj);
protected:

CHtmlView *m_pParentHtmlView;

DECLARE_MESSAGE_MAP()
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
};

然后在消息映射中

BEGIN_MESSAGE_MAP(XXXXSink, CCmdTarget)
END_MESSAGE_MAP()

BEGIN_DISPATCH_MAP(XXXXSink, CCmdTarget)
DISP_FUNCTION_ID(XXXXSink,"onclick", DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnHtmlClick, VT_EMPTY, VTS_DISPATCH)
END_DISPATCH_MAP()

BEGIN_INTERFACE_MAP(XXXXSink, CCmdTarget)
INTERFACE_PART(XXXXSink, DIID_HTMLElementEvents2, Dispatch)

END_INTERFACE_MAP()


函数定义中

void XXXXSink::OnHtmlClick(IHTMLEventObj *pEvtObj)
{
IHTMLElement * pElement = NULL;
HRESULT res = pEvtObj->get_srcElement(&pElement);
IHTMLEventObj2* pObjEvent2 = NULL;
res = pEvtObj->QueryInterface(IID_IHTMLEventObj2, (void**)&pObjEvent2);
if(res == S_OK&& pObjEvent2)
{
TRACE("OnHtmlClick---pObjEvent2\r\n");
pObjEvent2->put_clientX(50);
pObjEvent2->put_clientY(50);

}
}

以上为Sink必要代码;
下面是在CXXXXHtmlView对Sink的使用的相关代码


hr = AfxConnectionAdvise(m_pDocument2, DIID_HTMLDocumentEvents2, m_pSink->GetIDispatch(FALSE), FALSE, &m_dwCookie); // m_pSink 已经定义为成员变量



在sink的消息映射中使用的是DIID_HTMLElementEvents2接口,但在AfxConnectionAdvise的连接时如果指定为HTMLElementEvents2将收不到映射消息。

而像上面写成DIID_HTMLDocumentEvents2则可以。这是为何呢?


说明:
在使用DIID_HTMLDocumentEvents2时AfxConnect...()第一个参数为通过IID_IHTMLDocument2接口获取的对象。
在使用DIID_HTMLElementEvents2时AfxConnect...()连接函数的第一个参数通过每个IHTMLElement2的对象获得


上述的功能是实现了,但总感觉有些不对劲。毕竟映射和连接都不同,却竟然起了作用,希望高人给以指点。

谢谢!

2. 我想做到在鼠标点击IHTMLAnchorElement对象之前获取到鼠标的点,并且加以修改,然后跳转到目标href中。
因此,在上述所说的void XXXXSink::OnHtmlClick(IHTMLEventObj *pEvtObj)下,我从IHTMLEventObj获取到IHTMLEventObj2接口,然后试图调用接口的put_clientX以及put_clientY来实现坐标的更改,但随后发现测试网页的scrip中获取的坐标并没有更改。也就是没有起作用;甚至在put_clientX之后就调用了pEvtObj的get_clientX来查看下,也发现没有更改成功,在此,想问,这里是为什么呢,又要如何做才可以!


针对这个问题,我又尝试了fireEvent来实现,但fireEvent只是模拟了Element的onclick事件,但并不会出发页面跳转,如果需要跳转仍需要Navigate来实现,这就失去了真实性。而对于用navigate并传入header参数的仍是一片未知。


再次希望高人,前辈加以指点或者提示。
谢谢。


/* 同时如果有对我在上面提出问题感兴趣而又因为我的描述不清无法提供帮助的,都可随时加以提问,我会尽力将问题描述清楚,诚心求助*/
...全文
461 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
许文君 2013-12-23
  • 打赏
  • 举报
回复
由于此贴已经较长时间没有回帖了,请LZ在收到此回复一周内进行结贴,若过期则会由版主强制进行结贴,感谢您对版主工作的理解和支持。
fishion 2013-12-23
  • 打赏
  • 举报
回复
用DIID_HTMLElementEvents2要对应用IHTMLElementX接口吧 用DIID_HTMLElementEvents2就用IHTMLDocumentX接口 IHTMLEventObj 中的clientX方法中没有put形式,只有get形式,倒是IHTMLElement2::scrollLeft中有put形式
开心的卡夫卡 2012-11-16
  • 打赏
  • 举报
回复
第二天,再次求助!
开心的卡夫卡 2012-11-15
  • 打赏
  • 举报
回复
再次一个人顶。希望有人帮助。
开心的卡夫卡 2012-11-15
  • 打赏
  • 举报
回复
再次求助;希望关注。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧