IWebBrowser2控件中快捷键、TAB等无效的解决办法

发布时间:2017年12月3日 作者:未知 查看次数:1086

IWebBrowser2控件中,Ctrl+V、TAB等键无效。经查找:



IWebBrowser2控件快捷键,DEL,TAB等无效的解决办法

http://www.hoverlees.com/blog/?p=1056


在普通情况下,IWebBrowser2控件加入到窗口中时,浏览器的快捷键,包括DEL,TAB等特殊键都不能使用。这个不是控件的Bug,而是一种特性。要让控件处理这些按键,需要通过webBrowser插件的IOleInPlaceActiveObject来处理。

具体操作是在主窗口的事件循环里处理。步骤如下:

1
2
3
4
5
6
7
8
9
10
11
//窗口主循环线程
while(bRet=GetMessage(&msg,NULL,0,0)!=0){
    if(bRet==-1) break;
    TranslateMessage(&msg);
 
    if(IsDialogMessage(WebBrowser2控件窗口句柄,&msg)){//如果是控件窗口的消息
        QueryInterface取得IWebBrowser2的IOleInPlaceActiveObject
        调用IOleInPlaceActiveObject的TranslateAccelerator函数,参数是&msg
    }
    else DispatchMessage(&msg);
}

C语言使用者在QueryInterface和调用COM对象函数时,可以用我另一编关于COM的C调用的函数库。


==============================================

具体取IWebBrowser2的IOleInPlaceActiveObject如下:

(IWebBrowser2* iWebBrowser; )

----

IOleInPlaceActiveObject *m_pInPlaceAcObj; //对象

iWebBrowser->QueryInterface(IID_IOleInPlaceActiveObject,(void**)&m_pInPlaceAcObj);

        m_pInPlaceAcObj->TranslateAccelerator(&msg);

----

代码:

==============================================

可是这样发现所有输入的字符都重复2次,包括Backspace键,左右箭头键。

将TranslateMessage移到DispatchMessage前面,发现输入字符不重复了,但Backspace等键仍有两次作用。

只好用VK_UP等过滤。

代码如下:

int bMsgRet;

IOleInPlaceActiveObject *m_pInPlaceAcObj; //对象

iWebBrowser->QueryInterface(IID_IOleInPlaceActiveObject,(void**)&m_pInPlaceAcObj);

while(bMsgRet=GetMessage(&msg, NULL, 0, 0)!=0)  

{

if(-1==bMsgRet)break;

if(IsDialogMessage(hWebWnd,&msg)){

if((msg.wParam == VK_UP) || (msg.wParam == VK_DOWN)|| (msg.wParam == VK_LEFT) || (msg.wParam == VK_RIGHT)  || (msg.wParam == VK_BACK))

{

}

else

{

m_pInPlaceAcObj->TranslateAccelerator(&msg);

}

}

else

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}  



================================

不知是什么原因。

望能有好的方法请指教。





版权所有!www.sieye.cn
E.Mail:sieye@sohu.com QQ:66697110