这两个操作默认是被屏蔽了的,需要手动拦截按键消息然后处理。 如果嵌入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; } }