【问题标题】:IHTMLEventObj::put_keyCode fails in IE9 RCIHTMLEventObj::put_keyCode 在 IE9 RC 中失败
【发布时间】:2023-03-31 02:23:01
【问题描述】:

我有一个 3 年前创建的 IE BHO,它使用 IHTMLEventObj::put_keyCode 函数。此功能已按照 IE6、IE7 和 IE8 中的说明工作。但是,当使用 IE9 RC 进行测试时,它不再像记录的那样工作。该函数以相同的方式调用,结果为 S_OK,但输入字段中未显示该键。甚至我的 Invoke() 函数也在 DISPID_HTMLELEMENTEVENTS2_ONKEYPRESS 中进行调用。

我发现有人遇到类似问题:http://social.msdn.microsoft.com/Forums/is/ieextensiondevelopment/thread/abcbaffd-ed8a-45b8-840b-8ad8d7d10081,但由于某种原因,我无法查看该问题。我可以使用谷歌缓存查看它:http://webcache.googleusercontent.com/search?q=cache:3OkEceoi6jwJ:social.msdn.microsoft.com/Forums/is/ieextensiondevelopment/thread/abcbaffd-ed8a-45b8-840b-8ad8d7d10081+put_keyCode+IE9&cd=1&hl=pt-BR&ct=clnk&gl=br&source=www.google.com.br

任何帮助将不胜感激,这是一个需要尽快解决的关键问题。

提前致谢。

更新: 这是一些代码,但要强调的是,此代码在 IE6、IE7 和 IE8 中完美运行。 IE9返回S_OK,但是key没有变化。

BOOL CToolBandObj::InvokeElementOnKeyPress (    DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
                                            DISPPARAMS* pDispParams, VARIANT* pvarResult,
                                            EXCEPINFO*  pExcepInfo,  UINT* puArgErr)
{

    CComPtr<IDispatch> spEventObj;
    spEventObj = pDispParams->rgvarg[0].pdispVal;
    CComPtr<IHTMLEventObj> pHtmlEvent; 
    HRESULT hr = spEventObj->QueryInterface(IID_IHTMLEventObj,(LPVOID*)&pHtmlEvent);

    if (SUCCEEDED(hr) && pHtmlEvent)
    {
        CComPtr<IHTMLElement>spElement;
        hr = pHtmlEvent->get_srcElement(&spElement);

        _bstr_t bstrTag;
        spElement->get_tagName(&bstrTag.GetBSTR());

        if (SUCCEEDED(hr) && spElement)
        {
            LONG lKeyCode = 0;
            pHtmlEvent->get_keyCode(&lKeyCode);


            pHtmlEvent->put_keyCode(lKeyCode);
            pvarResult->vt = VT_BOOL;
            pvarResult->boolVal = VARIANT_TRUE;
            return TRUE;
        }
    }
}

更新 2

我们已经提交了 MSDN 案例,他们发现了问题,最后我们收到他们的消息,打算解决它。

【问题讨论】:

  • 输入字段是什么类型的?
  • 您能否为您的 OnKeyPress 事件发布一些示例代码以显示您在其中所做的事情?
  • 您是否在 pvarResult 中返回 VARIANT_TRUE 以取消冒泡?
  • 您好 Maurizio,感谢所有回复。我已经更新了上面截取的代码。当我复制它时,我删除了一些额外的逻辑,并在这样做时删除了最终的返回代码。为什么你认为它在 IE6、IE7、IE8 中完美运行,而在 IE9 中却不行。此代码已有 3 年多的历史,并且运行良好,并且正在生产中。它只在 IE9 中失败。再次感谢!
  • 如果您查看有关 onkeypress 事件 link 的 MSDN 文档,您会注意到以下内容: 在 Internet Explorer 9 中,事件对象的类型取决于您使用的是 attachEvent 还是 addEventListener注册事件处理程序。如果您使用 addEventListener 注册处理程序,则会在事件期间传递一个 KeyboardEvent 类型的对象。如果您使用 attachEvent,则会传递旧事件对象。

标签: c++ internet-explorer-9 bho ihtmldocument2


【解决方案1】:

在打开一个案例并经过数周后,终于发布了一个修复程序:The IHTMLEventObj::put_keyCode function does not work in Internet Explorer 9 Standards mode

谢谢微软!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 2011-08-07
    • 2016-01-17
    • 2013-02-07
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多