0X20.cpp
上传用户:hyz2004817
上传日期:2022-03-30
资源大小:226k
文件大小:5k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. extern BOOL g_bMustExit;
  3. BOOL
  4. WINAPI
  5. ResponseJPGImage(
  6. SOCKET s,
  7. HANDLE hEventArray[2],
  8. int x,
  9. int y,
  10. int w,
  11. int h,
  12. int zw,
  13. int zh,
  14. int iQuality
  15. )
  16. {
  17. HDC hdcScreen = CreateDC( "DISPLAY", NULL, NULL, NULL );
  18. if( hdcScreen == NULL )
  19. return FALSE;
  20. BYTE * pRGBBuffer = NULL;
  21. BITMAPINFOHEADER bmih;
  22. DWORD dwBI = sizeof(BITMAPINFOHEADER);
  23. HBITMAP hbm =                      // 24;JPEG 压缩要求 24 位色深
  24. GetDCPixel_BMP(hdcScreen, x, y, w, h, zw, zh, 24, (void**)&pRGBBuffer, &bmih, &dwBI );
  25. if( hbm == NULL )
  26. {
  27. DeleteDC( hdcScreen );
  28. return FALSE;
  29. }
  30. BYTE * pJPEGBuffer;
  31. DWORD dwJPEGBufferSize;
  32. // 将 24 位 WINDOWS DIB 像素值编码进一个 JPEG 缓冲, 
  33. // 缓冲内存由 EncodeToJPEGBuffer 分配, 由调用者释放.
  34. if( FALSE == EncodeToJPEGBuffer( pRGBBuffer, bmih.biWidth, bmih.biHeight, 
  35. &pJPEGBuffer, &dwJPEGBufferSize, iQuality ) )
  36. {
  37. DeleteDC( hdcScreen );
  38. DeleteObject( hbm );
  39. return FALSE;
  40. }
  41. BOOL bExit = FALSE;
  42. RCARESPONSEHEADER rresh;
  43. // 初始化一个 "200 OK"应答头
  44. InitResponseHead( &rresh, RCA_RESPONSE_200_OK, sizeof(RCARESPONSEHEADER)+dwJPEGBufferSize );
  45. // 发送应答头
  46. if( FALSE == RCASend_EventSelectIO( s, hEventArray, (char*)&rresh, 
  47. sizeof(RCARESPONSEHEADER)) )
  48. {
  49. DeleteDC( hdcScreen );
  50. DeleteObject( hbm );
  51. delete[] pJPEGBuffer;
  52. return FALSE;
  53. }
  54. // 发送编码后的 JPEG 数据
  55. if( FALSE == RCASend_EventSelectIO( s, hEventArray, (char*)pJPEGBuffer, 
  56. dwJPEGBufferSize) )
  57. {
  58. DeleteDC( hdcScreen );
  59. DeleteObject( hbm );
  60. delete[] pJPEGBuffer;
  61. return FALSE;
  62. }
  63. // clean up resources
  64. DeleteDC( hdcScreen );
  65. DeleteObject( hbm );
  66. delete[] pJPEGBuffer;
  67. return TRUE;
  68. }
  69. BOOL 
  70. WINAPI
  71. ResponseBMPImage(
  72. SOCKET s,
  73. HANDLE hEventArray[2],
  74. int x,
  75. int y,
  76. int w,
  77. int h,
  78. int zw,
  79. int zh,
  80. WORD wBitCount
  81. )
  82. {
  83. HDC hdc = CreateDC( "DISPLAY", NULL, NULL, NULL );
  84. if( hdc == NULL )
  85. return FALSE;
  86. DWORD dwBMPInfoSize;
  87. if( wBitCount <= 8 )
  88. dwBMPInfoSize = sizeof(RGBQUAD) * 256 + sizeof(BITMAPINFOHEADER);
  89. else 
  90. dwBMPInfoSize = sizeof(BITMAPINFOHEADER);
  91. // allocate memory for BITMAPINFOHEADER struct
  92. BYTE * ptmp = new BYTE[dwBMPInfoSize];
  93. if( ptmp == NULL )
  94. {
  95. DeleteDC( hdc );
  96. return FALSE;
  97. }
  98. PBITMAPINFOHEADER pbmih = (PBITMAPINFOHEADER)ptmp;
  99. PVOID pBits;
  100. // 获取请求 DC 矩形的象素值和 BITMAPINFOHEADER 结构
  101. HBITMAP hbm = GetDCPixel_BMP( hdc, x, y, w, h, zw, zh, dwBMPInfoSize==40 ? 24 : 8, 
  102. &pBits, pbmih, &dwBMPInfoSize );
  103. if( hbm == NULL )
  104. {
  105. DeleteDC( hdc );
  106. delete[] ptmp;
  107. return FALSE;
  108. }
  109. RCARESPONSEHEADER rresh;
  110. DIBSECTION ds;
  111. //DWORD dwTotalBytes;
  112. GetObject( hbm, sizeof(ds), &ds );
  113. BITMAPFILEHEADER bmfh;
  114. bmfh.bfType = 0x404D;
  115. bmfh.bfOffBits = sizeof(bmfh) + dwBMPInfoSize;
  116. bmfh.bfSize = sizeof(bmfh) + dwBMPInfoSize + ds.dsBmih.biSizeImage;
  117. bmfh.bfReserved1 = 0;
  118. bmfh.bfReserved2 = 0;
  119. InitResponseHead( &rresh, RCA_RESPONSE_200_OK, sizeof(rresh)+bmfh.bfSize);
  120. // 首先发送 RCA response header
  121. BOOL bExit = FALSE;
  122. INT  ret;
  123. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&rresh,sizeof(rresh));
  124. if( ret != sizeof(rresh) )
  125. {
  126. bExit = TRUE;
  127. goto ResponseBMPImage_end;
  128. }
  129. // 然后发送 BITMAP file header
  130. ret = RCASend_EventSelectIO( s, hEventArray, (char*)&bmfh, sizeof(bmfh));
  131. if( ret != sizeof(bmfh))
  132. {
  133. bExit = TRUE;
  134. goto ResponseBMPImage_end;
  135. }
  136. // 这里发送 BITMAP information header
  137. ret = RCASend_EventSelectIO( s, hEventArray, (char*)pbmih, dwBMPInfoSize);
  138. if( ret != dwBMPInfoSize)
  139. {
  140. bExit = TRUE;
  141. goto ResponseBMPImage_end;
  142. }
  143. // 最后发送像素数据
  144. ret = RCASend_EventSelectIO( s, hEventArray, (char*)pBits, ds.dsBmih.biSizeImage);
  145. if( ret != ds.dsBmih.biSizeImage )
  146. {
  147. bExit = TRUE;
  148. goto ResponseBMPImage_end;
  149. }
  150. ResponseBMPImage_end: // clean up resource
  151. DeleteDC( hdc );
  152. delete[] ptmp;
  153. DeleteObject( hbm );
  154. return bExit;
  155. }
  156. ////////////////////////////////////////////////////////////
  157. //
  158. // 截屏 
  159. //
  160. // ID: 0x20
  161. //
  162. BOOL 
  163. WINAPI 
  164. RCAID_0X20_HANDLER( 
  165. SOCKET s, 
  166. RCAREQUESTHANDLEDATA *  pData, 
  167. RCAREQUESTHEADER * pRCAHead, 
  168. HANDLE hEventArray[2]
  169. )
  170. {
  171. DWORD c = pRCAHead->requestBytes - sizeof(RCAREQUESTHEADER); // 计算需要接收的总字节数
  172. char * buf; // 数据接收缓冲
  173. int ret; // 保存返回值
  174. int i = c; // 还剩多少字节需要接收
  175. int left = 0; // 接收数据偏移量
  176. buf = (char*)new char[c];
  177. if( buf == NULL )
  178. return FALSE;
  179. ret = RCARecv_EventSelectIO( s, hEventArray, buf, c );
  180. if( ret != c )
  181. {
  182. delete[] buf;
  183. return FALSE;
  184. }
  185. // 成功的后的操作
  186. PRCAGETIMAGEDATA p;
  187. BOOL b;
  188. p = (PRCAGETIMAGEDATA)buf;
  189. if( p->dwImageFormat == IMAGE_FORMAT_BMP ) // 请求的是 BMP 格式
  190. {
  191. WORD w;
  192. if( p->iBitCount <= 8 )
  193. w = 8;
  194. else if ( p->iBitCount <=16 )
  195. w = 16;
  196. else if( p->iBitCount <=24 )
  197. w = 24;
  198. else 
  199. w = 32;
  200. b = ResponseBMPImage( s, hEventArray, 
  201. p->x, p->y, p->w, p->h, p->zw, p->zh, w );
  202. } else 
  203. {
  204. if( p->dwImageFormat == IMAGE_FORMAT_JPG )
  205. {
  206. // p->dwFlagEx1 是一个特定图象的附加数据, 这里描述 JPEG 图象的质量
  207. b = ResponseJPGImage( s, hEventArray, 
  208. p->x, p->y, p->w, p->h, p->zw, p->zh, p->dwFlagEx1 );
  209. }
  210. }
  211. delete[] buf;
  212. return TRUE;
  213. }