您的位置:首页 > 其它

关于在IWebBrowser中无法响应Ctrl+C等快捷键的解决方法

2013-06-13 09:29 387 查看
最近在WIN32项目中用到IWebBrower2接口,发现复制粘贴等快捷键无法使用,后再网上查询到可以再消息循环阶段拦截IE的消息进行处理,代码如下:

if (msg.message >= WM_KEYDOWN  && msg.message < WM_KEYLAST) {
TCHAR szClassName[256] = {0};
::GetClassName(msg.hwnd, szClassName, 256);
if (_tcsicmp(szClassName, _T("Internet Explorer_Server")) == 0) {
HMODULE hModule = ::LoadLibrary(_T("OLEACC.DLL"));
if (hModule) {
LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));
::SendMessageTimeout(msg.hwnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes);
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress(hModule, _T("ObjectFromLresult"));
if (pfObjectFromLresult)  {
CComPtr<IServiceProvider> spServiceProv;
HRESULT hr = (*pfObjectFromLresult)(lRes, IID_IServiceProvider, 0, (void**)&spServiceProv);
if (SUCCEEDED(hr)) {
IWebBrowser2* pWebBrowser2 = NULL;
hr = spServiceProv->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&pWebBrowser2);
IOleInPlaceActiveObject* pOleInPlaceActiveObject = NULL;
hr = pWebBrowser2->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID*)&pOleInPlaceActiveObject);
if (hr == S_OK && pOleInPlaceActiveObject) {
hr = pOleInPlaceActiveObject->TranslateAccelerator(&msg);
DWORD dw = ::GetLastError();
if (hr == S_OK) {
continue;
}
}
}
}
::FreeLibrary( hModule );
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐