解决COM显示HTML,无法copy、paste的问题
2010-04-15 19:23
381 查看
这两个操作默认是被屏蔽了的,需要手动拦截按键消息然后处理。
如果嵌入HTML的窗口拿不到WM_KEYDOWN这样的消息,就只好直接在消息循环里拦截了:
然后检查按键:
如果嵌入HTML的窗口拿不到WM_KEYDOWN这样的消息,就只好直接在消息循环里拦截了:
{ while (0 != (r = GetMessage(&msg, NULL, 0, 0))) { if (r == -1) { break; } if (CheckIfDealCopyPaste(msg)) { continue; } TranslateMessage(&msg); DispatchMessage(&msg); } }
然后检查按键:
bool CheckIfDealCopyPaste(const MSG &msg) { if (msg.message != WM_KEYDOWN) { return false; } BOOL bCtrlDown = (0x80 & GetKeyState(VK_CONTROL)); if (msg.wParam == _T('X') && bCtrlDown) { DoCommand(L"Cut"); return true; } else if (msg.wParam == _T('C') && bCtrlDown) { DoCommand(L"Copy"); return true; } else if (msg.wParam == _T('V') && bCtrlDown) { DoCommand(L"Paste"); return true; } else if (msg.wParam == _T('A') && bCtrlDown) { DoCommand(L"SelectAll"); return true; } return false; } void DoCommand(LPCWSTR szCommand) { BSTR bStr = SysAllocString(szCommand); DoWebCommand(m_hWnd, bStr); // m_hWnd为嵌入HTML的窗口句柄 SysFreeString(bStr); } // 这是一个C函数 void WINAPI DoWebCommand(HWND hWnd, BSTR idCmd) { IOleObject **browserHandle; IOleObject *browserObject; TRACE_FUNC; if ((browserHandle = (IOleObject **)GetWindowLongPtr(hWnd, GWLP_USERDATA))) { browserObject = *browserHandle; do { IWebBrowser2 *webBrowser2 = NULL; IConnectionPointContainer *spCPC = NULL; IConnectionPoint *spCP = NULL; IDispatch *pDoc = NULL; IHTMLDocument2 *htmlDoc = NULL; VARIANT_BOOL bVal; HRESULT hr; hr = browserObject->lpVtbl->QueryInterface(browserObject, &IID_IWebBrowser2, (void**)&webBrowser2); if (hr != S_OK) { break; } hr = webBrowser2->lpVtbl->get_Document(webBrowser2, &pDoc); if (hr != S_OK) { break; } hr = pDoc->lpVtbl->QueryInterface(pDoc, &IID_IHTMLDocument2, (void **)&htmlDoc); if (hr != S_OK) { break; } // 此步必要,判断当前document是否允许此操作 // 否则会允许执行非法的操作 // 如把整个网页直接ctrl+x清掉 hr = htmlDoc->lpVtbl->queryCommandEnabled(htmlDoc, idCmd, &bVal); if (hr != S_OK) { break; } if (bVal) { VARIANT_BOOL bRet; VARIANT v; v.vt = VT_NULL; hr = htmlDoc->lpVtbl->execCommand(htmlDoc, idCmd, VARIANT_TRUE, v, &bRet); if (hr != S_OK || !bRet) { break; } } } while(0); return; } }
相关文章推荐
- 解决 asp.net 伪静态 IIS设置后 真正的HTML无法显示的问题
- 请问如何解决WORD转HTML是出现的“内存或磁盘空间不足,无法显示或打印图片”这个问题?
- 解决IDEA开发JavaWeb项目修改了HTML或Servlet/JSP后刷新浏览器无法及时显示修改后的页面的问题
- 解决java中html转word文档,转成功后的word文档在断网情况下无法显示图片问题
- 解决JSON包含HTML标签无法显示的问题
- 解决 asp.net 伪静态 IIS设置后 直正HTML无法显示的问题
- [转-来自啊泰]推模式下dataset1下显示的是"...未找到项目..." 问题的解决[补充] [http://www.cnblogs.com/babyt/archive/2005/04/15/138588.html]
- 请问如何解决WORD转HTML是出现的“内存或磁盘空间不足,无法显示或打印图片”这个问题?
- html内textarea嵌套ckeditor编辑器,文本框无法显示值的问题解决
- [转-来自啊泰]推模式下dataset1下显示的是"...未找到项目..." 问题的解决 [http://www.cnblogs.com/babyt/archive/2005/04/15/138582.html]
- 解决 asp.net 伪静态 IIS设置后 直正HTML无法显示的问题
- 解决json包含html标签无法显示的问题
- WindowsPhone问题笔记-- 正确选择build action 解决媒体资源无法读取问题 转:http://www.cnblogs.com/qinxg/archive/2012/07/17/2594503.html
- ToolBar中menu无法同时显示图标和文字问题的解决方法
- jenkins 的html report 无法显示的解决办法
- iis打开aspx文件时显示无法找到该页问题解决方法
- 如何解决下载的CHM文件无法显示网页问题
- Active Report for .net"在VS中正常显示在IIS中无法显示"的问题之解决办法
- 解决Gitlab的Gravatar头像无法显示的问题
- vs2015web工程中的html引用压缩后css后无法智能提示的问题解决