none
c++使用mshtml如何设置事件? RRS feed

  • 问题

  •     我是使用COM接口直接host mshtml的,没有使用webBrowser控件或MFC,是通过IWebBrowser2接口使用mshtml。
        按照官方文档的描述,有三种方法可以对IHtmlElement设置事件(IE11内核),分别是IEventTaget->addEventListener(), IConectionPoint->Advise(), 以及IHtmlElement自带的on[event]()。我三种方式都有使用,主要是用的IEventTaget。
        我遇到了不少的问题。首要的问题是:随着事件的不断处理,系统的速度会越来越慢,CPU的占用会越来越高。我的第一反应是:对象没有及时释放,侦听器没有正确删除。可我不知道问题出在哪儿:我使用IHTMLDocument创建元素,缓存了每个元素的IHTMLElement,在需要的时候通过它获得IEventTaget,然后用IEventTaget->addEventListener()添加事件,用IEventTaget->removeEventListener()删除事件。在每个事件的处理过程中,我用IHTMLWindow2->getEvent()获得IHTMLEventObj,用完之后调用Release()释放。我还特地检查了返回的引用计数,确保值为0。我实在想不出有什么地方没有做对,为什么系统响应会越来越慢呢?
        我自定义的传递给addEventListener()的事件对象继承了IDispatch接口。我发现在事件处理过程中,它的引用计数一直在不断增加,只会增加,不会减少。时间越长,处理次数越多,值也越大,到了删除的时候,引用计数还依然是一个大于零的正数。这是怎么回事?
        另一个大问题是无法设置键盘事件,确切地说是键盘事件只可以处理一次。设置了键盘事件后只可以捕捉第一次键盘按键,然后再按键盘就完全收不到事件了,我搞不清是怎么回事。而且这捕获到的唯一一次也不是所有的按键都能收到,只包括字母和数字,如果按ctrl那是收不到的。另外我用来host mshtml的类继承了IDocHostUIHandler,但是其中的TranslateAccelarate()从来没有被调用过,按理来说只要按下键盘这个函数就会被调用,这又是怎么回事呢?
        我以前用过javaScript,所以c++也是按照类似的思路设置事件的,但是碰到的问题非常不一样,有谁知道mshtml的用法吗?

    2019年5月21日 12:44

全部回复

  • 你好,

    能否告知一下,你如何使用mshtml的代码吗?

    另外有关如何使用MSHTML,我建议你可以参考下面有关如何使用MSHTML的文章

    https://blog.csdn.net/lanuage/article/details/72825878 


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2019年5月24日 2:05
  • 我用的是mshtml,不是cshtml, 就是IE11的内核Trident。代码差不多是这样的:

    IHTMLElement* elem;
    document->createElement(SysAllocString(L"img"),  (void**)&elem);    //创建元素
    IEventTarget* event;
    elem->QueryInterface(IID_IEventTarget,  (void**)&event);     //获取元素的事件对象接口
    event->addEventListener(SysAllocString(L"load"),  (IDispatch*)eventHandler, 0);     //添加侦听器

    ......

    mshtml是很古老的东西了,在网上很难查到资料。虽然msdn有mshtml的资料(现在也不全了),但实际使用会出现很多上面没提到的问题。不知道有谁用过mshtml,能否告知一二。

    2019年5月25日 12:38