将 Web 页上的图像复制到剪贴板上最好的方法是使用 execCommandcontrolRange 对象的方法。若要在页本身 (授予要复制的图像 ID) 上的脚本中执行此从下面的代码阐释:
function copyImage(sImgID)
{
var ctrlRange = document.body.createControlRange();
ctrlRange.add(document.all(sImgID));
ctrlRange.execCommand("Copy");
}
在 Microsoft Visual c + +,此方法调用转换为 IHTMLControlRange::execCommand。下面的代码演示如何在 Visual c + + 的 IDispatch 指针给包含图像和 VARIANT 结构中 (与 VT_BSTR 类型) 包装的 IMG 元素的 ID 在文档中实现相同的技术:
STDMETHODIMP CMyBrowser::CopyImage(LPDISPATCH pDispDoc, VARIANT vImageID)
{
HRESULT hr = E_FAIL;
IHTMLDocument2* pDoc = NULL;
IHTMLElement* pelmBody = NULL;
IHTMLElement2* pelmBodyTwo = NULL;
IDispatch* pdispImgElement = NULL;
IDispatch* pdispCtrlRange = NULL;
IHTMLElementCollection* pColl = NULL;
IHTMLControlElement* pCtrlElement = NULL;
IHTMLControlRange* pCtrlRange = NULL;
BSTR bstrCommand = SysAllocString(L"Copy");
VARIANT_BOOL vbReturn;
VARIANT vEmpty;
VariantInit(&vEmpty);
if (pDispDoc == NULL)
goto Cleanup;
if (FAILED(pDispDoc->QueryInterface(IID_IHTMLDocument2, (void**) &pDoc)))
goto Cleanup;
if (FAILED(pDoc->get_all(&pColl)))
goto Cleanup;
if (FAILED(pColl->item(vImageID, vEmpty, &pdispImgElement))
|| pdispImgElement == NULL)
goto Cleanup;
if (FAILED(pDoc->get_body(&pelmBody)) || pelmBody == NULL)
goto Cleanup;
if (FAILED(pelmBody->QueryInterface(IID_IHTMLElement2, (void**) &pelmBodyTwo))
|| pelmBodyTwo == NULL)
goto Cleanup;
if (FAILED(pelmBodyTwo->createControlRange(&pdispCtrlRange))
|| pdispCtrlRange == NULL)
goto Cleanup;
if (FAILED(pdispCtrlRange->QueryInterface(IID_IHTMLControlRange, (void**) &pCtrlRange))
|| pCtrlRange == NULL)
goto Cleanup;
if (FAILED(pdispImgElement->QueryInterface(IID_IHTMLControlElement, (void**) &pCtrlElement))
|| pCtrlElement == NULL)
goto Cleanup;
hr = pCtrlRange->add(pCtrlElement);
if (SUCCEEDED(hr))
hr = pCtrlRange->execCommand(bstrCommand, VARIANT_FALSE, vEmpty, &vbReturn);
pCtrlElement->Release();
hr = S_OK;
Cleanup:
SysFreeString(bstrCommand);
if (pCtrlRange)
pCtrlRange->Release();
if (pdispCtrlRange)
pdispCtrlRange->Release();
if (pelmBodyTwo)
pelmBodyTwo->Release();
if (pelmBody)
pelmBody->Release();
if (pdispImgElement)
pdispImgElement->Release();
if (pColl)
pColl->Release();
if (pDispDoc)
pDispDoc->Release();
return hr;
}