关于在COM组件中 ATL/WTL使用webbroswer控件无法响应Ctrl+A Ctrl+V Ctrl+C及回车键的处理
2010-03-18 11:20
986 查看
如果在COM组件中ATL/WTL窗口中使用了webbroswer控件,这时默认情况下是无法响应Ctrl+A Ctrl+V Ctrl+C等快捷键的
so我以CDialogImpl类为例子说明
首先创建webbroswer控件使用一个包装类
在对话框中
其他钩子的释放不再列出....
其实主要是需要在消息循环中筛选消息向webbroswer窗口发送消息
处理方式为::SendMessage(hWndCtl, WM_FORWARDMSG, 0, (LPARAM)pMsg);
以便使webbroswer控件有机会转换处理;
so我以CDialogImpl类为例子说明
首先创建webbroswer控件使用一个包装类
class CHTMLWin : public CWindowImpl< CHTMLWin, CAxWindow> { ::ATL::CComPtr<IWebBrowser2> m_pBrowserApp; // Message map and handlers BEGIN_MSG_MAP(CHTMLWin) MESSAGE_HANDLER(WM_CREATE, OnCreate) END_MSG_MAP() virtual void OnFinalMessage(HWND /*hWnd*/) { delete this; } BOOL PreTranslateMessage(MSG* pMsg) { if((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) && (pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST)) return FALSE; BOOL bRet = FALSE; // give HTML page a chance to translate this message if(pMsg->hwnd == m_hWnd || IsChild(pMsg->hwnd)) bRet = (BOOL)SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg); return bRet; } LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) { LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); // Connect events HRESULT hRet = QueryControl(IID_IWebBrowser2, (void**)&m_pBrowserApp); if(SUCCEEDED(hRet)) { if(FAILED(DispEventAdvise(m_pBrowserApp, &DIID_DWebBrowserEvents2))) ATLASSERT(FALSE); } // Set host flag to indicate that we handle themes CComPtr<IAxWinAmbientDispatch> spHost; hRet = QueryHost(IID_IAxWinAmbientDispatch, (void**)&spHost); if(SUCCEEDED(hRet)) { hRet = spHost->put_DocHostFlags(DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_THEME); ATLASSERT(SUCCEEDED(hRet)); } //lRet = LoadSourceHtm() ? 0 : -1; return lRet; } virtual void OnFinalMessage(HWND /*hWnd*/) { delete this; } }
在对话框中
HHOOK hHook = NULL; class CHTMLDlg : public CDialogImpl<CHTMLDlg >, public CMessageFilter, public CIdleHandler { ...... CString m_strResourceURL; CHTMLWin *m_pHTML ; static CHTMLDlg* m_pThis; // 使用钩子来处理转发消息 static LRESULT FAR PASCAL MsgProc(int nCode, WPARAM wParam, LPARAM lParam) { LPMSG lpMsg = (LPMSG) lParam; if ( nCode >= 0 && PM_REMOVE == wParam ) { if ( (lpMsg->message != WM_CHAR && lpMsg->message >= WM_KEYFIRST && lpMsg->message <= WM_KEYLAST) ) { if (m_pThis->PreTranslateMessage(lpMsg)) // 调用CDialogImpl中的PreTranslateMessage,很重要以实现快捷键响应 { lpMsg->hwnd = NULL; lpMsg->message = WM_NULL; lpMsg->lParam = 0; lpMsg->wParam = 0; } } } return CallNextHookEx(hHook, nCode, wParam, lParam); } virtual BOOL PreTranslateMessage(MSG* pMsg) { if (pMsg->message==WM_KEYDOWN && pMsg->wParam == 0x0D) pMsg->message = WM_CHAR; // 将回车转为此种消息以使webbrowser处理 if (m_pHTML && m_pHTML->PreTranslateMessage(pMsg) ) return TRUE; return CWindow::IsDialogMessage(pMsg); } virtual BOOL OnIdle() { return FALSE; } LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { bHandled = TRUE; m_pThis = this; CString szModule; if (GetModuleFileName(_AtlBaseModule.m_hInst, szModule.GetBuffer(_MAX_PATH), _MAX_PATH)) { m_strResourceURL.Format(_T("res://%s/%d"), szModule, IDR_HTML1); // 资源中的网页 } szModule.ReleaseBuffer(); // 创建网页控件 m_pHTML = new CHTMLWin; m_pHTML->Create(m_hWnd, 0, m_strResourceURL); // m_strResourceURL可以替换为其它URL地址,但必须是URL以确保创建网页控件 hHook = SetWindowsHookEx( WH_GETMESSAGE, MsgProc, NULL, GetCurrentThreadId() ); return 1; // Let the system set the focus } ..... }
其他钩子的释放不再列出....
其实主要是需要在消息循环中筛选消息向webbroswer窗口发送消息
处理方式为::SendMessage(hWndCtl, WM_FORWARDMSG, 0, (LPARAM)pMsg);
以便使webbroswer控件有机会转换处理;
相关文章推荐
- 关于EDIT等控件不能响应CTRL+V和CTRL+C的解决
- 关于asp.net网站发布后,使用登录控件和注册控件时出现“数据库只读,无法进行数据更新”的解决方法
- 关于子视图超出父视图后无法响应点击事件的处理办法
- 关于回车事件的响应处理
- 关于IE浏览器页面按纽等控件点击无反应的处理方案(IE浏览器的脚本无法运行)
- Android中Spinner控件关于二次点击同一item无响应事件解析及处理方法
- 关于Android Studio无法使用EditText拖控件。。。API20!
- WTL的SDI中Edit控件无法使用快捷键原因
- 游戏开发时关于UGUI的一些控件无法使用的问题
- 关于点击菜单项或按钮无法弹出对话框的问题(使用了RichEdit控件)
- 关于SubSonic3.0插件使用实体进行更新操作时(执行T.Update()或T.Save()),某些列无法进行修改操作的问题处理
- 关于Java中使用hessian-3.0.20调用远程服务连接出错异常try catch无法捕捉的问题处理
- 对启用了ReadOnly属性的WebEdit控件无法使用Set方法赋值的处理办法
- 关于Gridview中使用控件和图片导出到Excel的处理
- 关于VS2010 转到函数定义无响应 以及MFC项目双击控件无法跳转到响应函数解决方法
- ListView的OnItemClick无法响应以及子Item控件的事件处理。
- Edit 控件响应或处理 回车消息
- 关于win7 64位系统无法使用ODBC的处理方法
- CFormView中控件无法响应Ctrl+C和Ctrl+V消息的解决办法
- 关于Gridview中使用控件和图片导出到Excel的处理