為什么我用webbrowser控制元件加載網頁后,將驗證碼圖片copy到剪貼板后,程式里面對剪貼板操作 粘貼不出來圖片,但是在Word檔案中又能粘貼出來,在畫圖里面也粘貼不出來,請問是什么原因啊,以下是copy代碼和剪貼板操作代碼
HRESULT hr;
IDispatch *pDisp = NULL;
pDisp = m_web.get_Document(); //得到webBrowser控制元件介面
IHTMLDocument2* pDoc = NULL;
hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到網頁檔案介面
IHTMLElementCollection* pColl=NULL;
hr=pDoc->get_all(&pColl);//得到所有網頁元素記錄集合
IDispatch *pDisp2 = NULL;
VARIANT index;//用于接識訓傳元素基于的索引,一般不用,設為就好,而是用IDispatch 接收元素物件介面
index.vt=VT_I4;
index.lVal=0;
VARIANT varIdName;//要查找的HTML標記ID及該出驗證碼圖片ID
varIdName=StringToVariant(_T("TANGRAM__PSP_3__verifyCodeImg"));
/*varIdName=StringToVariant(_T("randomCodeImg")); */
hr=pColl->item(varIdName, index, &pDisp2); //找到元素的位置
if(S_OK == hr && NULL != pDisp2)
{
CString dd;//臨時變數
IHTMLElement* pelmBody = NULL;
if (FAILED(pDoc->get_body(&pelmBody)) || pelmBody == NULL)//這里出現例外退出
goto Cleanup;
IHTMLElement2* pelmBodyTwo = NULL;
if (FAILED(pelmBody->QueryInterface(IID_IHTMLElement2, (void**) &pelmBodyTwo)) || pelmBodyTwo == NULL)
goto Cleanup;
IDispatch* pdispCtrlRange = NULL;
if (FAILED(pelmBodyTwo->createControlRange(&pdispCtrlRange)) || pdispCtrlRange == NULL)
goto Cleanup;
IHTMLControlRange* pCtrlRange = NULL;
if (FAILED(pdispCtrlRange->QueryInterface(IID_IHTMLControlRange, (void**) &pCtrlRange)) || pCtrlRange == NULL)
goto Cleanup;
IHTMLControlElement* pCtrlElement = NULL;
if (FAILED(pDisp2->QueryInterface(IID_IHTMLControlElement, (void**) &pCtrlElement))|| pCtrlElement == NULL)
goto Cleanup;
hr = pCtrlRange->add(pCtrlElement);
VARIANT vEmpty;
vEmpty.vt=VT_UINT;
vEmpty.lVal=0;
BSTR bstrCommand = SysAllocString(L"Copy");//Cut
VARIANT_BOOL vbReturn;
//OpenClipboard();
// 清空剪貼板
//EmptyClipboard();
//long len;
if (SUCCEEDED(hr))
{
hr = pCtrlRange->execCommand(bstrCommand, VARIANT_FALSE, vEmpty, &vbReturn);//拷貝到記憶體
//pCtrlRange->get_length(&len);
}
// 使剪貼板內的格式轉變成指定格式。
//EnumClipboardFormats(CF_BITMAP);
//CloseClipboard();
pCtrlElement->Release();
dd.Format(L"%d",vbReturn);
AfxMessageBox(dd);
Cleanup:
SysFreeString(bstrCommand);
if (pCtrlRange)
pCtrlRange->Release();
if (pdispCtrlRange)
pdispCtrlRange->Release();
if (pelmBodyTwo)
pelmBodyTwo->Release();
if (pelmBody)
pelmBody->Release();
if (pColl)
pColl->Release();
}
if (pDisp2)
pDisp2->Release();
OpenClipboard();
// 獲取剪貼板資料句柄
HANDLE hBitmap = GetClipboardData(CF_BITMAP); //get the bmp handle!
if (hBitmap)
{
AfxMessageBox(L"data");
// 獲取設備環境句柄
CStatic* pWnd = (CStatic*)GetDlgItem(IDC_STATIC); // 得到 Picture Control 句柄
CDC *pDc = pWnd->GetDC();
HDC hDC = pDc->GetSafeHdc();
// 創建與設備相關的記憶體環境
HDC hdcMem = CreateCompatibleDC(hDC);
// 選擇物件
SelectObject(hdcMem, hBitmap);
// 設定映射模式
SetMapMode(hdcMem, GetMapMode(hDC));
//得到位圖物件
BITMAP bm;
//位圖復制
GetObject(hBitmap, sizeof(BITMAP), &bm);
BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
//釋放設備環境句柄
//ReleaseDC(hDC);
DeleteDC(hdcMem);
// 洗掉記憶體環境
}
//關閉剪貼板
CloseClipboard();
uj5u.com熱心網友回復:
參考MSDN里面的剪貼板查看器源代碼。uj5u.com熱心網友回復:
能給個網址嗎uj5u.com熱心網友回復:
這明顯就是剪貼板資料格式不對啊uj5u.com熱心網友回復:
我很多格式都試過了 不行 網址我用的是https://passport.baidu.com/v2/?login 里面的驗證碼圖片是png的
if (OpenClipboard())
{
UINT clipboard_format = 0;
while(clipboard_format = EnumClipboardFormats(clipboard_format))
{
printf("Clipboard Data Format = 0x%x\n", clipboard_format);
HGLOBAL global_memory = GetClipboardData(clipboard_format);
LPCSTR clipboard_data = (LPCSTR)GlobalLock(global_memory);
if (clipboard_data != NULL)
{
// 剪切板上資料的地址
printf("Clipboard Data Address = 0x%x\n", global_memory);
// 剪切板上資料大小
DWORD data_size = GlobalSize(global_memory);
printf("Data Size = %d\n", data_size);
// 16進制輸出資料
printf("Data: ");
switch(clipboard_format)
{
case CF_TEXT:
AfxMessageBox(L"CF_TEXT");
break;
case CF_BITMAP:
AfxMessageBox(L"CF_BITMAP");
break;
case CF_METAFILEPICT:
AfxMessageBox(L"CF_METAFILEPICT");
break;
case CF_SYLK:
AfxMessageBox(L"CF_SYLK");
break;
case CF_DIF:
AfxMessageBox(L"CF_DIF");
break;
case CF_TIFF:
AfxMessageBox(L"CF_TIFF");
break;
case CF_OEMTEXT:
AfxMessageBox(L"CF_OEMTEXT");
break;
case CF_DIB:
AfxMessageBox(L"CF_DIB");
break;
case CF_PALETTE:
AfxMessageBox(L"CF_PALETTE");
break;
case CF_PENDATA:
AfxMessageBox(L"CF_PENDATA");
break;
case CF_RIFF:
AfxMessageBox(L"CF_RIFF");
break;
case CF_WAVE:
AfxMessageBox(L"CF_WAVE");
break;
case CF_UNICODETEXT:
AfxMessageBox(L"CF_UNICODETEXT");
break;
case CF_ENHMETAFILE:
AfxMessageBox(L"CF_ENHMETAFILE");
break;
//default:
//AfxMessageBox(L"OTHERS");
//break;
}
GlobalUnlock(global_memory);
}
}
CloseClipboard();
}
我用這些 格式去取 就算取到了 資料大小也不對 ,大小為4
uj5u.com熱心網友回復:
4 個位元組 有可能是 IDataObject 句柄 試試 OleGetClipboardOLE剪貼板和普通剪貼板_chenkun_新浪博客
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/132509.html
