您的位置:首页 > Web前端 > HTML

解决COM显示HTML,无法copy、paste的问题

2010-04-15 19:23 381 查看
这两个操作默认是被屏蔽了的,需要手动拦截按键消息然后处理。

如果嵌入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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐