GetScreenToBitmap.cpp
上传用户:cjw5120
上传日期:2022-05-11
资源大小:5032k
文件大小:8k
源码类别:

网络截获/分析

开发平台:

Visual C++

  1. // GetScreenToBitmap.cpp: implementation of the CGetScreenToBitmap class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "MyClient.h"
  6. #include "GetScreenToBitmap.h"
  7. //#include "jpeglib.H"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. CGetScreenToBitmap::CGetScreenToBitmap()
  17. {
  18. m_lpBmpData = NULL;
  19. m_dwBmpSize = 0;
  20. m_dwBmpInfoSize = 0;
  21. }
  22. CGetScreenToBitmap::~CGetScreenToBitmap()
  23. {
  24.    ResetVariable();
  25. }
  26. void CGetScreenToBitmap::ResetVariable()
  27. {
  28. /*    if(m_lpBmpData)
  29.    GlobalUnlock(m_hBmpData);
  30.     if(m_hBmpData)
  31.        GlobalFree(m_hBmpData);
  32. */
  33. // if(m_lpBmpData) delete m_lpBmpData;
  34.     if(m_lpBmpData) GlobalFree(m_lpBmpData);
  35. m_lpBmpData = NULL;
  36.     m_dwBmpSize = 0;
  37.     m_dwBmpInfoSize = 0;
  38. }
  39. LPSTR FAR CGetScreenToBitmap::GetImage()
  40. {
  41.  return m_lpBmpData;
  42. }
  43. DWORD CGetScreenToBitmap::GetImageSize()
  44. {
  45.  return m_dwBmpSize;
  46. }
  47. //DEL BOOL CGetScreenToBitmap::GetScreen2Bmp(CRect rcArea,int nBits, int nArea)
  48. //DEL {
  49. //DEL /* CDC dc;
  50. //DEL  CDC *pdc;
  51. //DEL  dc.CreateDC("DISPLAY",NULL,NULL,NULL);
  52. //DEL  CBitmap bm;
  53. //DEL  int Width=GetSystemMetrics(SM_CXSCREEN);
  54. //DEL  int Height=GetSystemMetrics(SM_CYSCREEN);
  55. //DEL  bm.CreateCompatibleBitmap(&dc,Width,Height);
  56. //DEL 
  57. //DEL 
  58. //DEL  CDC tdc;
  59. //DEL  tdc.CreateCompatibleDC(&dc);
  60. //DEL  CBitmap*pOld=tdc.SelectObject(&bm);
  61. //DEL  tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
  62. //DEL  tdc.SelectObject(pOld);
  63. //DEL  BITMAP btm;
  64. //DEL  bm.GetBitmap(&btm);
  65. //DEL  DWORD size=btm.bmWidthBytes*btm.bmHeight;
  66. //DEL  LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
  67. //DEL /////////////////////////////////////////////
  68. //DEL  BITMAPINFOHEADER bih;
  69. //DEL  bih.biBitCount=btm.bmBitsPixel;
  70. //DEL  bih.biClrImportant=0;
  71. //DEL  bih.biClrUsed=0;
  72. //DEL  bih.biCompression=0;
  73. //DEL  bih.biHeight=btm.bmHeight;
  74. //DEL  bih.biPlanes=1;
  75. //DEL  bih.biSize=sizeof(BITMAPINFOHEADER);
  76. //DEL  bih.biSizeImage=size;
  77. //DEL  bih.biWidth=btm.bmWidth;
  78. //DEL  bih.biXPelsPerMeter=0;
  79. //DEL  bih.biYPelsPerMeter=0;
  80. //DEL ///////////////////////////////////
  81. //DEL  GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
  82. //DEL  //bm.GetBitmapBits(size,lpData); //此函数在处理5-5-5模式的16位色下会出现颜色混乱
  83. //DEL //////////////////////////////
  84. //DEL  static int filecount=0;
  85. //DEL  CString name;
  86. //DEL  name.Format("pict%04d.bmp",filecount++);
  87. //DEL  name=m_Path+name;
  88. //DEL  BITMAPFILEHEADER bfh;
  89. //DEL  bfh.bfReserved1=bfh.bfReserved2=0;
  90. //DEL  bfh.bfType=((WORD)('M'<< 8)|'B');
  91. //DEL  bfh.bfSize=54+size;
  92. //DEL  bfh.bfOffBits=54;
  93. //DEL  CFile bf;
  94. //DEL  if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
  95. //DEL  bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
  96. //DEL  bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
  97. //DEL  bf.WriteHuge(lpData,size);
  98. //DEL  bf.Close();
  99. //DEL  nCount++;
  100. //DEL  }
  101. //DEL  GlobalFreePtr(lpData);
  102. //DEL  if(nCount==1)
  103. //DEL  m_Number.Format("%d picture captured.",nCount);
  104. //DEL  else
  105. //DEL  m_Number.Format("%d pictures captured.",nCount);
  106. //DEL  UpdateData(FALSE);
  107. //DEL */
  108. //DEL  return 1;
  109. //DEL }
  110. BOOL CGetScreenToBitmap::GetScreen(CRect rcArea,int nBits, int nArea)
  111. {
  112. HDC hScrDC, hMemDC; // 屏幕和内存设备描述表
  113. HBITMAP hBitmap, hOldBitmap; // 位图句柄
  114. // int xScrn, yScrn; // 屏幕分辨率 
  115. HDC hDC; //设备描述表
  116. int iBits; //当前显示分辨率下每个像素所占字节数
  117. WORD wBitCount; //位图中每个像素所占字节数
  118. //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
  119. DWORD dwPaletteSize=0, dwBmBitsSize;
  120. BITMAP Bitmap; //位图属性结构
  121. BITMAPINFOHEADER bi; //位图信息头结构 
  122. LPBITMAPINFOHEADER lpbi; //指向位图信息头结构
  123. //定义文件,分配内存句柄,调色板句柄  
  124. // HANDLE hDib;
  125. HPALETTE hPal,hOldPal=NULL;
  126.     //释放原有资源
  127. ResetVariable();
  128. // 获得屏幕分辨率
  129. SetArea(rcArea, nArea); //取图象区域
  130. //为屏幕创建设备描述表
  131. hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
  132. /*过时
  133. xScrn = GetDeviceCaps(hScrDC, HORZRES);
  134. yScrn = GetDeviceCaps(hScrDC, VERTRES);
  135. //确保选定区域是可见的
  136. if (rcArea.left < 0)
  137. rcArea.left = 0;
  138. if (rcArea.top < 0)
  139. rcArea.top = 0;
  140. if (rcArea.right > xScrn)
  141. rcArea.right = xScrn;
  142. if (rcArea.bottom > yScrn)
  143. rcArea.bottom = yScrn;
  144. */
  145. //为屏幕设备描述表创建兼容的内存设备描述表
  146. hMemDC = CreateCompatibleDC(hScrDC);
  147. // 创建一个与屏幕设备描述表兼容的位图
  148. hBitmap = CreateCompatibleBitmap (hScrDC, 
  149.       m_rcArea.Width(), m_rcArea.Height());
  150. // 把新位图选到内存设备描述表中
  151. hOldBitmap = (HBITMAP) SelectObject(hMemDC, 
  152.           hBitmap);
  153. // 把屏幕设备描述表拷贝到内存设备描述表中
  154. BitBlt(hMemDC, 0, 0, m_rcArea.Width(), 
  155.    m_rcArea.Height(), hScrDC, 
  156.    m_rcArea.left, m_rcArea.top, SRCCOPY);
  157. //得到屏幕位图的句柄
  158. hBitmap = (HBITMAP) SelectObject(hMemDC, hOldBitmap);
  159. //计算位图每个像素所占字节数
  160. iBits = GetDeviceCaps(hScrDC, BITSPIXEL);
  161. iBits = iBits * GetDeviceCaps(hScrDC, PLANES);
  162. if (iBits <= 1)
  163. wBitCount = 1;
  164. else if (iBits <= 4)
  165. wBitCount = 4;
  166. else if (iBits <= 8)
  167. wBitCount = 8;
  168. else// if (iBits <= 24)
  169. wBitCount = 24;
  170. if (wBitCount > nBits)
  171. wBitCount = nBits;
  172. //计算调色板大小
  173. if (wBitCount <= 8)
  174. dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);
  175. //设置位图信息头结构
  176. GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
  177. bi.biSize = sizeof(BITMAPINFOHEADER);
  178. bi.biWidth = Bitmap.bmWidth;
  179. bi.biHeight = Bitmap.bmHeight;
  180. bi.biPlanes = 1;
  181. bi.biBitCount = wBitCount;
  182. bi.biCompression = BI_RGB;
  183. bi.biSizeImage = 0;
  184. bi.biXPelsPerMeter = 0;
  185. bi.biYPelsPerMeter = 0;
  186. bi.biClrUsed = dwPaletteSize/sizeof(RGBQUAD);
  187. bi.biClrImportant = 0;
  188. dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32)* 4 *Bitmap.bmHeight ;
  189. m_dwBmpInfoSize = dwPaletteSize + sizeof(BITMAPINFOHEADER);
  190. m_dwBmpSize = dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER);
  191. //为位图内容分配内存
  192. /* m_hBmpData  = GlobalAlloc(GHND,m_dwBmpSize);
  193. if (m_hBmpData == NULL) goto Exit01;
  194. m_lpBmpData = (char *)GlobalLock(m_hBmpData);
  195. if (m_lpBmpData == NULL) goto Exit01;
  196. */
  197. // m_lpBmpData = (LPSTR)new BYTE[m_dwBmpSize];
  198. m_lpBmpData  = (LPSTR)GlobalAlloc(GMEM_FIXED,m_dwBmpSize);
  199. if (m_lpBmpData == NULL) goto Exit01;
  200.     lpbi = (LPBITMAPINFOHEADER)m_lpBmpData;
  201. *lpbi = bi;
  202. // 处理调色板   
  203. hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE);
  204. if (hPal)
  205. {
  206. hDC = ::GetDC (NULL);
  207. hOldPal = ::SelectPalette(hDC, hPal, FALSE);
  208. RealizePalette(hDC);
  209. }
  210. // 获取该调色板下新的像素值
  211. ::GetDIBits(
  212. hDC,
  213. hBitmap,
  214. 0, 
  215. (UINT) Bitmap.bmHeight,
  216. (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize,
  217. //(BITMAPINFOHEADER *)lpbi,
  218. (BITMAPINFO *)lpbi,
  219. DIB_RGB_COLORS
  220.   );
  221. //恢复调色板
  222. if (hOldPal)
  223. {
  224. SelectPalette(hDC, hOldPal, TRUE);
  225. RealizePalette(hDC);
  226. ::ReleaseDC(NULL, hDC);
  227. }
  228. //DEL m_lpBmpData = (char *)lpbi;
  229. //清除
  230. DeleteObject (hBitmap);
  231. DeleteObject (hOldBitmap);
  232. DeleteDC(hScrDC);
  233. DeleteDC(hMemDC);
  234. return TRUE;
  235. Exit01:
  236. ResetVariable();
  237. DeleteObject (hBitmap);
  238. DeleteDC(hScrDC);
  239. DeleteDC(hMemDC);
  240. return FALSE;
  241. }
  242. void CGetScreenToBitmap::SetArea(CRect rcArea, int nArea)
  243. {
  244. //为屏幕创建设备描述表
  245. HWND hFocus;
  246. int xScrn, yScrn; // 屏幕分辨率 
  247. HDC hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
  248. // 获得屏幕分辨率
  249. xScrn = GetDeviceCaps(hScrDC, HORZRES);
  250. yScrn = GetDeviceCaps(hScrDC, VERTRES);
  251. DeleteDC(hScrDC);
  252.     m_rcArea.left = 0;
  253.     m_rcArea.top = 0;
  254.     m_rcArea.right = xScrn;
  255.     m_rcArea.bottom = yScrn;
  256.     if (nArea == 1 &&  //1)当前窗口2)指定区域0)全屏
  257.         (hFocus = ::GetForegroundWindow()) != NULL)
  258. {
  259.     GetWindowRect(hFocus, &m_rcArea);
  260. }
  261. else if(nArea == 2)
  262. {
  263.     m_rcArea =  rcArea;
  264. }
  265. if (m_rcArea.left < 0)
  266. m_rcArea.left = 0;
  267. if (m_rcArea.top < 0)
  268. m_rcArea.top = 0;
  269. if (m_rcArea.right > xScrn)
  270. m_rcArea.right = xScrn;
  271. if (m_rcArea.bottom > yScrn)
  272. m_rcArea.bottom = yScrn;
  273. //确保选定区域是可见的
  274. }