加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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);  
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读