GetScreenToBitmap.cpp
资源名称:Visualhk.rar [点击查看]
上传用户:cjw5120
上传日期:2022-05-11
资源大小:5032k
文件大小:8k
源码类别:
网络截获/分析
开发平台:
Visual C++
- // GetScreenToBitmap.cpp: implementation of the CGetScreenToBitmap class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "MyServer.h"
- #include "GetScreenToBitmap.h"
- //#include "jpeglib.H"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CGetScreenToBitmap::CGetScreenToBitmap()
- {
- m_lpBmpData = NULL;
- m_dwBmpSize = 0;
- m_dwBmpInfoSize = 0;
- }
- CGetScreenToBitmap::~CGetScreenToBitmap()
- {
- ResetVariable();
- }
- void CGetScreenToBitmap::ResetVariable()
- {
- /* if(m_lpBmpData)
- GlobalUnlock(m_hBmpData);
- if(m_hBmpData)
- GlobalFree(m_hBmpData);
- */
- // if(m_lpBmpData) delete m_lpBmpData;
- if(m_lpBmpData) GlobalFree(m_lpBmpData);
- m_lpBmpData = NULL;
- m_dwBmpSize = 0;
- m_dwBmpInfoSize = 0;
- }
- LPSTR FAR CGetScreenToBitmap::GetImage()
- {
- return m_lpBmpData;
- }
- DWORD CGetScreenToBitmap::GetImageSize()
- {
- return m_dwBmpSize;
- }
- //DEL BOOL CGetScreenToBitmap::GetScreen2Bmp(CRect rcArea,int nBits, int nArea)
- //DEL {
- //DEL /* CDC dc;
- //DEL CDC *pdc;
- //DEL dc.CreateDC("DISPLAY",NULL,NULL,NULL);
- //DEL CBitmap bm;
- //DEL int Width=GetSystemMetrics(SM_CXSCREEN);
- //DEL int Height=GetSystemMetrics(SM_CYSCREEN);
- //DEL bm.CreateCompatibleBitmap(&dc,Width,Height);
- //DEL
- //DEL
- //DEL CDC tdc;
- //DEL tdc.CreateCompatibleDC(&dc);
- //DEL CBitmap*pOld=tdc.SelectObject(&bm);
- //DEL tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
- //DEL tdc.SelectObject(pOld);
- //DEL BITMAP btm;
- //DEL bm.GetBitmap(&btm);
- //DEL DWORD size=btm.bmWidthBytes*btm.bmHeight;
- //DEL LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
- //DEL /////////////////////////////////////////////
- //DEL BITMAPINFOHEADER bih;
- //DEL bih.biBitCount=btm.bmBitsPixel;
- //DEL bih.biClrImportant=0;
- //DEL bih.biClrUsed=0;
- //DEL bih.biCompression=0;
- //DEL bih.biHeight=btm.bmHeight;
- //DEL bih.biPlanes=1;
- //DEL bih.biSize=sizeof(BITMAPINFOHEADER);
- //DEL bih.biSizeImage=size;
- //DEL bih.biWidth=btm.bmWidth;
- //DEL bih.biXPelsPerMeter=0;
- //DEL bih.biYPelsPerMeter=0;
- //DEL ///////////////////////////////////
- //DEL GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
- //DEL //bm.GetBitmapBits(size,lpData); //此函数在处理5-5-5模式的16位色下会出现颜色混乱
- //DEL //////////////////////////////
- //DEL static int filecount=0;
- //DEL CString name;
- //DEL name.Format("pict%04d.bmp",filecount++);
- //DEL name=m_Path+name;
- //DEL BITMAPFILEHEADER bfh;
- //DEL bfh.bfReserved1=bfh.bfReserved2=0;
- //DEL bfh.bfType=((WORD)('M'<< 8)|'B');
- //DEL bfh.bfSize=54+size;
- //DEL bfh.bfOffBits=54;
- //DEL CFile bf;
- //DEL if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
- //DEL bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
- //DEL bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
- //DEL bf.WriteHuge(lpData,size);
- //DEL bf.Close();
- //DEL nCount++;
- //DEL }
- //DEL GlobalFreePtr(lpData);
- //DEL if(nCount==1)
- //DEL m_Number.Format("%d picture captured.",nCount);
- //DEL else
- //DEL m_Number.Format("%d pictures captured.",nCount);
- //DEL UpdateData(FALSE);
- //DEL */
- //DEL return 1;
- //DEL }
- BOOL CGetScreenToBitmap::GetScreen(CRect rcArea,int nBits, int nArea)
- {
- HDC hScrDC, hMemDC; // 屏幕和内存设备描述表
- HBITMAP hBitmap, hOldBitmap; // 位图句柄
- // int xScrn, yScrn; // 屏幕分辨率
- HDC hDC; //设备描述表
- int iBits; //当前显示分辨率下每个像素所占字节数
- WORD wBitCount; //位图中每个像素所占字节数
- //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
- DWORD dwPaletteSize=0, dwBmBitsSize;
- BITMAP Bitmap; //位图属性结构
- BITMAPINFOHEADER bi; //位图信息头结构
- LPBITMAPINFOHEADER lpbi; //指向位图信息头结构
- //定义文件,分配内存句柄,调色板句柄
- // HANDLE hDib;
- HPALETTE hPal,hOldPal=NULL;
- //释放原有资源
- ResetVariable();
- // 获得屏幕分辨率
- SetArea(rcArea, nArea); //取图象区域
- //为屏幕创建设备描述表
- hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
- /*过时
- xScrn = GetDeviceCaps(hScrDC, HORZRES);
- yScrn = GetDeviceCaps(hScrDC, VERTRES);
- //确保选定区域是可见的
- if (rcArea.left < 0)
- rcArea.left = 0;
- if (rcArea.top < 0)
- rcArea.top = 0;
- if (rcArea.right > xScrn)
- rcArea.right = xScrn;
- if (rcArea.bottom > yScrn)
- rcArea.bottom = yScrn;
- */
- //为屏幕设备描述表创建兼容的内存设备描述表
- hMemDC = CreateCompatibleDC(hScrDC);
- // 创建一个与屏幕设备描述表兼容的位图
- hBitmap = CreateCompatibleBitmap (hScrDC,
- m_rcArea.Width(), m_rcArea.Height());
- // 把新位图选到内存设备描述表中
- hOldBitmap = (HBITMAP) SelectObject(hMemDC,
- hBitmap);
- // 把屏幕设备描述表拷贝到内存设备描述表中
- BitBlt(hMemDC, 0, 0, m_rcArea.Width(),
- m_rcArea.Height(), hScrDC,
- m_rcArea.left, m_rcArea.top, SRCCOPY);
- //得到屏幕位图的句柄
- hBitmap = (HBITMAP) SelectObject(hMemDC, hOldBitmap);
- //计算位图每个像素所占字节数
- iBits = GetDeviceCaps(hScrDC, BITSPIXEL);
- iBits = iBits * GetDeviceCaps(hScrDC, PLANES);
- if (iBits <= 1)
- wBitCount = 1;
- else if (iBits <= 4)
- wBitCount = 4;
- else if (iBits <= 8)
- wBitCount = 8;
- else// if (iBits <= 24)
- wBitCount = 24;
- if (wBitCount > nBits)
- wBitCount = nBits;
- //计算调色板大小
- if (wBitCount <= 8)
- dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);
- //设置位图信息头结构
- GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
- bi.biSize = sizeof(BITMAPINFOHEADER);
- bi.biWidth = Bitmap.bmWidth;
- bi.biHeight = Bitmap.bmHeight;
- bi.biPlanes = 1;
- bi.biBitCount = wBitCount;
- bi.biCompression = BI_RGB;
- bi.biSizeImage = 0;
- bi.biXPelsPerMeter = 0;
- bi.biYPelsPerMeter = 0;
- bi.biClrUsed = dwPaletteSize/sizeof(RGBQUAD);
- bi.biClrImportant = 0;
- dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32)* 4 *Bitmap.bmHeight ;
- m_dwBmpInfoSize = dwPaletteSize + sizeof(BITMAPINFOHEADER);
- m_dwBmpSize = dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER);
- //为位图内容分配内存
- /* m_hBmpData = GlobalAlloc(GHND,m_dwBmpSize);
- if (m_hBmpData == NULL) goto Exit01;
- m_lpBmpData = (char *)GlobalLock(m_hBmpData);
- if (m_lpBmpData == NULL) goto Exit01;
- */
- // m_lpBmpData = (LPSTR)new BYTE[m_dwBmpSize];
- m_lpBmpData = (LPSTR)GlobalAlloc(GMEM_FIXED,m_dwBmpSize);
- if (m_lpBmpData == NULL) goto Exit01;
- lpbi = (LPBITMAPINFOHEADER)m_lpBmpData;
- *lpbi = bi;
- // 处理调色板
- hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE);
- if (hPal)
- {
- hDC = ::GetDC (NULL);
- hOldPal = ::SelectPalette(hDC, hPal, FALSE);
- RealizePalette(hDC);
- }
- // 获取该调色板下新的像素值
- ::GetDIBits(
- hDC,
- hBitmap,
- 0,
- (UINT) Bitmap.bmHeight,
- (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize,
- //(BITMAPINFOHEADER *)lpbi,
- (BITMAPINFO *)lpbi,
- DIB_RGB_COLORS
- );
- //恢复调色板
- if (hOldPal)
- {
- SelectPalette(hDC, hOldPal, TRUE);
- RealizePalette(hDC);
- ::ReleaseDC(NULL, hDC);
- }
- //DEL m_lpBmpData = (char *)lpbi;
- //清除
- DeleteObject (hBitmap);
- DeleteObject (hOldBitmap);
- DeleteDC(hScrDC);
- DeleteDC(hMemDC);
- return TRUE;
- Exit01:
- ResetVariable();
- DeleteObject (hBitmap);
- DeleteDC(hScrDC);
- DeleteDC(hMemDC);
- return FALSE;
- }
- void CGetScreenToBitmap::SetArea(CRect rcArea, int nArea)
- {
- //为屏幕创建设备描述表
- HWND hFocus;
- int xScrn, yScrn; // 屏幕分辨率
- HDC hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
- // 获得屏幕分辨率
- xScrn = GetDeviceCaps(hScrDC, HORZRES);
- yScrn = GetDeviceCaps(hScrDC, VERTRES);
- DeleteDC(hScrDC);
- m_rcArea.left = 0;
- m_rcArea.top = 0;
- m_rcArea.right = xScrn;
- m_rcArea.bottom = yScrn;
- if (nArea == 1 && //1)当前窗口2)指定区域0)全屏
- (hFocus = ::GetForegroundWindow()) != NULL)
- {
- GetWindowRect(hFocus, &m_rcArea);
- }
- else if(nArea == 2)
- {
- m_rcArea = rcArea;
- }
- if (m_rcArea.left < 0)
- m_rcArea.left = 0;
- if (m_rcArea.top < 0)
- m_rcArea.top = 0;
- if (m_rcArea.right > xScrn)
- m_rcArea.right = xScrn;
- if (m_rcArea.bottom > yScrn)
- m_rcArea.bottom = yScrn;
- //确保选定区域是可见的
- }