前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022.6.9日报:正确处理webbrowser控件的键盘消息

2022.6.9日报:正确处理webbrowser控件的键盘消息

作者头像
龙泉寺扫地僧
发布2022-06-12 13:54:59
3740
发布2022-06-12 13:54:59
举报
文章被收录于专栏:盟主来了盟主来了

最近被一个老掉牙的IE问题困扰了。

原因是这样,webbrowser控件无法响应百度首页那个下拉框。

网上查了下,说是要在消息循环里响应IOleInPlaceActiveObject::TranslateAccelerator

代码语言:javascript
复制
        if (CheckMessage(msg)) {
            MSG message = msg;
            //message.hwnd = g_ie_hwnd_test;
            IDispatch* disp = NULL;
            if (g_wb->GetWebBrowser()->get_Document(&disp) != S_OK)
                continue;

            IOleInPlaceActiveObject* oipao = NULL;
            if (disp->QueryInterface(IID_IOleInPlaceActiveObject, reinterpret_cast<void**>(&oipao)) == S_OK && oipao != NULL) {
                 oipao->TranslateAccelerator(&message);
                 oipao->Release();
            }
            disp->Release();

照做了以后,发现某些网页的textarea,例如Javascript在线解压缩 - 在线工具​​​​​​

按向下键,光标会下移动两行…

于是我用SetWindowLongPtr,hook了ie的窗口消息响应函数,然后把WM_KEYDOWN给禁用了。

这样做了以后,光标确实不会移动两行,但向下键也不会让页面滚动了。

这块把我卡住很久,甚至还翻了IE源码看了看。最后,我发现mfc里的chtmlview,居然是能正确处理这个问题的。微软这群屌毛,他们自己的东西当然知道怎么处理,但mfc源码那么多,怎么才能找到问题的关键呢?

最后,无意中,我发现MFC里这句话:

 没错,这里也是把先把消息派发给TranslateAccelerator。但原来这里是要判断返回值的。也就是说,我刚才没判断返回值,所以TranslateAccelerator处理完后又给IE窗口消息函数了。导致光标被移动了两次。

翻了下ie6源码,我发现TranslateAccelerator里面会处理光标移动,但也会处理页面滚动。我猜测是IE高版本的TranslateAccelerator和ie6的逻辑不一样。高版本的TranslateAccelerator里面不会产生页面滚动。

IE6的堆栈,多亏了我把ie6编译出来:

mshtml.exe!CDispRoot::ScrollRect(const CRec mshtml.exe!CDispScroller::SetScrollOffset(c mshtml.exe!CView::SmoothScroll(const tagSIZ mshtml.exe!CLayout::ScrollTo(const CSize &  mshtml.exe!CLayout::ScrollByPercent(const C mshtml.exe!CLayout::ScrollByLine(const CSiz mshtml.exe!CLayout::OnScroll(int iDirection mshtml.exe!CLayout::HandleScrollbarMessage( mshtml.exe!CLayout::HandleKeyDown(CMessage  mshtml.exe!CLayout::HandleMessage(CMessage  mshtml.exe!CFlowLayout::HandleMessage(CMess mshtml.exe!CBodyLayout::HandleMessage(CMess mshtml.exe!CElement::HandleMessage(CMessage mshtml.exe!CDoc::PerformTA(CMessage * pMess mshtml.exe!CDoc::PumpMessage(CMessage * pMe

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档