CWebbrowser中获取图片 我想在CWebBrowser2控件里跳转到一个网页并分析网页里的一个验证码图片,有什么办法直接获取这个图片吗?谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 先得到元素然后复制到剪切板,然后以bmp的格式从剪切板读出.http://support.microsoft.com/kb/293125 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; VARIANT vImageID; VariantInit(&vImageID); vImageID.vt = VT_UINT; vImageID.lVal = EleIndex; VariantInit(&vEmpty); m_CtrlWeb.Stop(); pNewDisp = m_CtrlWeb.get_Document(); if (FAILED(pNewDisp->QueryInterface(IID_IHTMLDocument2, (void**) &pDoc))) MessageBox(_T("1")); if (FAILED(pHTMLDocument.p->get_all(&pColl))) MessageBox(_T("2")); if (FAILED(pColl->item(vImageID, vEmpty, &pdispImgElement)) || pdispImgElement == NULL) MessageBox(_T("3")); if (FAILED(pHTMLDocument.p->get_body(&pelmBody)) || pelmBody == NULL) MessageBox(_T("4")); if (FAILED(pelmBody->QueryInterface(IID_IHTMLElement2, (void**) &pelmBodyTwo)) || pelmBodyTwo == NULL) MessageBox(_T("5")); if (FAILED(pelmBodyTwo->createControlRange(&pdispCtrlRange)) || pdispCtrlRange == NULL) MessageBox(_T("6")); if (FAILED(pdispCtrlRange->QueryInterface(IID_IHTMLControlRange, (void**) &pCtrlRange)) || pCtrlRange == NULL) MessageBox(_T("7")); if (FAILED(pdispImgElement->QueryInterface(IID_IHTMLControlElement, (void**) &pCtrlElement)) || pCtrlElement == NULL) MessageBox(_T("8")); hr = pCtrlRange->add(pCtrlElement); if (SUCCEEDED(hr)) { hr = pCtrlRange->execCommand(bstrCommand, VARIANT_FALSE, vEmpty, &vbReturn); if(SUCCEEDED(hr)) MessageBox(_T("9")); } HWND hWnd = GetSafeHwnd(); // 获取安全窗口句柄 HANDLE sBit; OpenClipboard(); HANDLE hBitmap = GetClipboardData(CF_BITMAP); // 获取剪贴板数据句柄 HDC hDC = ::GetDC(hWnd); // 获取设备环境句柄 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(hWnd, hDC); DeleteDC(hdcMem); CloseClipboard(); 你分析下含有验证码图片的html文件,找出可以唯一表示验证码的信息特征,通过上述代码把图片找出来复制到剪切板,然后从剪切板里读出来。就仿照微软官方的技术文档做。直接复制过去肯定不好用。 tabctrl显示图片的问题 高分求一个递归函数。 脱离vc环境运行程序! 程序退出时出错:after client block(#76) at 0x007...... 请问如果只显示进度条,不显示对话框怎么做? 如何作出动态界面元素? LoadLibrary的问题,请教高手(急!!!) 有关CDocument::UpdateAllViews()问题 帮帮新手!(关于访问access数据库的问题) 100分求助,任何帮助都有分!关于管道实现cmd.exe的疑问,很奇怪啊。 用VC++开发一个单纯的死机程序,100分 加 100元人民币 酬谢! 一个简单的问题——关于定时器的回调函数
http://support.microsoft.com/kb/293125
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;
VARIANT vImageID;
VariantInit(&vImageID);
vImageID.vt = VT_UINT;
vImageID.lVal = EleIndex;
VariantInit(&vEmpty);
m_CtrlWeb.Stop();
pNewDisp = m_CtrlWeb.get_Document();
if (FAILED(pNewDisp->QueryInterface(IID_IHTMLDocument2, (void**) &pDoc)))
MessageBox(_T("1"));
if (FAILED(pHTMLDocument.p->get_all(&pColl)))
MessageBox(_T("2"));
if (FAILED(pColl->item(vImageID, vEmpty, &pdispImgElement))
|| pdispImgElement == NULL)
MessageBox(_T("3"));
if (FAILED(pHTMLDocument.p->get_body(&pelmBody)) || pelmBody == NULL)
MessageBox(_T("4"));
if (FAILED(pelmBody->QueryInterface(IID_IHTMLElement2, (void**) &pelmBodyTwo))
|| pelmBodyTwo == NULL)
MessageBox(_T("5"));
if (FAILED(pelmBodyTwo->createControlRange(&pdispCtrlRange))
|| pdispCtrlRange == NULL)
MessageBox(_T("6"));
if (FAILED(pdispCtrlRange->QueryInterface(IID_IHTMLControlRange, (void**) &pCtrlRange))
|| pCtrlRange == NULL)
MessageBox(_T("7"));
if (FAILED(pdispImgElement->QueryInterface(IID_IHTMLControlElement, (void**) &pCtrlElement))
|| pCtrlElement == NULL)
MessageBox(_T("8"));
hr = pCtrlRange->add(pCtrlElement);
if (SUCCEEDED(hr))
{
hr = pCtrlRange->execCommand(bstrCommand, VARIANT_FALSE, vEmpty, &vbReturn);
if(SUCCEEDED(hr))
MessageBox(_T("9"));
}
HWND hWnd = GetSafeHwnd(); // 获取安全窗口句柄
HANDLE sBit; OpenClipboard();
HANDLE hBitmap = GetClipboardData(CF_BITMAP); // 获取剪贴板数据句柄
HDC hDC = ::GetDC(hWnd); // 获取设备环境句柄
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(hWnd, hDC);
DeleteDC(hdcMem);
CloseClipboard();