PrintWindow函数、CxImage、GSOAP实现隐藏窗口抓图到JPEG并通过w
发布时间:2020-12-17 00:24:55 所属栏目:安全 来源:网络整理
导读:类似于快照功能,前提是将需要抓图的窗口移到视区之外实现隐藏,并不是将窗口属性设为不可见,我的模块是在对话框子窗体中打开ie控件,浏览到指定网站并截图。 因此主窗体生成非模态对话框,该子对话框内嵌ie控件,并将该子对话框移到可视区域之外,环境依然
类似于快照功能,前提是将需要抓图的窗口移到视区之外实现隐藏,并不是将窗口属性设为不可见,我的模块是在对话框子窗体中打开ie控件,浏览到指定网站并截图。 因此主窗体生成非模态对话框,该子对话框内嵌ie控件,并将该子对话框移到可视区域之外,环境依然是VC6.0。 创建子对话框的代码: pShowBrowser=new CShowBrowser(); pShowBrowser->Create(IDD_SHOWBROWSER,this); pShowBrowser->MoveWindow(2000,1500,1024,768);//移到视区之外 pShowBrowser->ShowWindow(SW_SHOW); pShowBrowser->Navigate(www.baidu.com);//导航到指定网站 //抓图并保存到内存,以被GSOAP发送到webservice服务端 // pBinary: webservice二进制参数指针 void CNetTestVDlg::SaveImagetoBinary(xsd__base64Binary* pBinary) { //对VC6.0来说PrintWindow,是隐藏函数,通过地址使用 typedef BOOL ( __stdcall *pPrintWindow )(HWND hWnd,HDC hdcBlt,UINT nFlags); HMODULE h; h = LoadLibrary( _T("user32.dll") ); pPrintWindow p; if( h ) { p = ( pPrintWindow )::GetProcAddress( h,"PrintWindow"); } //pShowBrowser需要抓图的窗口的指针 HWND hWnd=pShowBrowser->GetSafeHwnd(); HDC hDC = ::GetWindowDC(hWnd); ASSERT(hDC); HDC hMemDC = ::CreateCompatibleDC(hDC); ASSERT(hMemDC); RECT rc; ::GetWindowRect(hWnd,&rc); HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC,rc.right - rc.left,rc.bottom - rc.top); ASSERT(hBitmap); HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC,hBitmap); p(hWnd,hMemDC,0); //抓图 BITMAP bitmap = {0}; ::GetObject(hBitmap,sizeof(BITMAP),&bitmap); BITMAPINFOHEADER bi = {0}; BITMAPFILEHEADER bf = {0}; CONST int nBitCount = 24; bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = bitmap.bmWidth; bi.biHeight = bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = nBitCount; bi.biCompression = BI_RGB; DWORD dwSize = ((bitmap.bmWidth * nBitCount + 31) / 32) * 4 * bitmap.bmHeight; HANDLE hDib = GlobalAlloc(GHND,dwSize + sizeof(BITMAPINFOHEADER)); LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); *lpbi = bi; ::GetDIBits(hMemDC,hBitmap,bitmap.bmHeight,(BYTE*)lpbi + sizeof(BITMAPINFOHEADER),(BITMAPINFO*)lpbi,DIB_RGB_COLORS); //用CaImage类实现bmp到jpeg的编码转换,并保存到内存文件 try { CxImage image((BYTE*)lpbi,dwSize,CXIMAGE_FORMAT_BMP);// if (image.IsValid()){ if(!image.IsGrayScale()) image.IncreaseBpp(24); // param nbit: 4,8,24 image.SetJpegQuality(99); // 设置图像的压缩质量参数(从0到100,数值越大,质量越高) CxMemFile memfile; // 显式使用CxMemFile对象 memfile.Open(); image.Encode(&memfile,CXIMAGE_FORMAT_JPG);//编码 BYTE* buffer = memfile.GetBuffer(); long size = memfile.Size(); int result = -1; //设置gsoap参数 xsd__base64Binary imag1; pBinary->__ptr = (unsigned char *)soap_malloc(pServiceSoap->soap,size); /*size为内存大小*/ pBinary->__size=size; memset(pBinary->__ptr,size); memcpy(pBinary->__ptr,buffer,size); /*src_ptr为源数据块指针*/ free(buffer); memfile.Close(); } } catch(CFileException* e) { e->ReportError(); e->Delete(); } GlobalUnlock(hDib); GlobalFree(hDib); ::SelectObject(hMemDC,hOldBmp); ::DeleteObject(hBitmap); ::DeleteObject(hMemDC); ::ReleaseDC(hWnd,hDC); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |