RCAClientLibrary.h
上传用户:hyz2004817
上传日期:2022-03-30
资源大小:226k
文件大小:9k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. #ifndef _RCACLIENTLIBRARY_H_
  2. #define _RCACLIENTLIBRARY_H_
  3. #include "stdafx.h"
  4. #define SERVER_LISTEN_PORT 4813
  5. #define SAFE_DELETE_ARRAY(x)  if(x!=NULL) { delete[] x; x = NULL; }
  6. #define SAFE_CLOSE_HANDLE(x)  if(x!=NULL) { CloseHandle( x ); x = NULL; }
  7. #define WSAERRORSTRING (WSAErrorString(WSAGetLastError()))
  8. #ifdef _DEBUG // 调试输出宏
  9. #define DEBUGOUTPUT1(x) cout << x << endl;
  10. #define DEBUGOUTPUT2(x, y) cout << x << y << endl;
  11. #define DEBUGOUTPUT3(x, y, z) cout << x << y << z << endl;
  12. #else
  13. #define DEBUGOUTPUT1(x) 
  14. #define DEBUGOUTPUT2(x, y) 
  15. #define DEBUGOUTPUT3(x, y, z)
  16. #endif
  17. // 定义应答状态码
  18. #define RCA_RESPONSE_200_OK 200
  19. #define RCA_RESPONSE_404_NOTFOUND 404
  20. #define RCA_RESPONSE_808_BYEBYE 808
  21. #define RCA_RESPONSE_502_FAILED 502
  22. ///////////////////////////////////////////
  23. // RCA 协议头结构 大小为 40 个字节
  24. //
  25. typedef struct _RCARequestHeader{
  26. char rcaID[4]; // "RCA"
  27. DWORD dwHeaderType; // header type
  28. BOOL bNeedResponse; // 是否需要应答
  29. WORD wMajorVersion; // 主版本号
  30. WORD wMinorVersion; // 次版本号
  31. DWORD dwRequestID; // 请求操作的 ID 号
  32. DWORD requestBytes; // 请求的总字节数
  33. char reserved[16]; // 保留 24 个字节
  34. } RCAREQUESTHEADER, *PRCAREQUESTHEADER;
  35. typedef struct _RCAResponseHeader {
  36. char rcaID [4]; // RCA ID "RCA"
  37. DWORD dwHeaderType; // RCA header type
  38. DWORD dwStatusCode; // RCA response status code
  39. DWORD dwTotalBytes; // response total bytes
  40. char reserved[24]; // 保留 28 个字节
  41. }RCARESPONSEHEADER, *PRCARESPONSEHEADER;
  42. typedef struct _RCAKeepAliveHeader {
  43. char rcaID[4];
  44. DWORD dwHeaderType;
  45. char reserved[32];
  46. }RCAKEEPALIVEHEADER, *PRCAKEEPALIVEHEADER;
  47. #define RCAHEADER_TYPE_KEEPALIVE 0 // 保活包
  48. #define RCAHEADER_TYPE_REQUEST 1 // 请求头
  49. #define RCAHEADER_TYPE_RESPONSE 2 // 响应头
  50. typedef struct _RCAHeader {
  51. char rcaID[4];
  52. DWORD dwHeaderType;
  53. char reserved[32];
  54. }RCAHEADER, *PRCAHEADER;
  55. // these uses to the dwImageFormat member of RCAGETSCREENDATA struct 
  56. #define IMAGE_FORMAT_BMP 1
  57. #define IMAGE_FORMAT_JPEG 2
  58. #define IMAGE_FORMAT_JPE IMAGE_FORMAT_JPEG
  59. #define IMAGE_FORMAT_JPG IMAGE_FORMAT_JPEG
  60. #define IMAGE_FORMAT_GIF 3
  61. ///////////////////////////////////////
  62. //
  63. //
  64. // 描述 : 请求服务器传送屏幕图像. 这个数据结构 大小为 48 字节.
  65. // 0x20 子协议要求的附带数据为 48 字节, 接收完这 48 字节后
  66. // 可以将这48 字节强制转换成 RCAGETSCREENDATA 结构
  67. //
  68. //
  69. //
  70. //
  71. typedef struct _RCAGetImageData{
  72. int x; // 截屏矩形的左上角的 x 座标
  73. int y; // 截屏矩形的左上角的 y 座标
  74. int w; // 截屏矩形的宽
  75. int h; // 截屏矩形的高
  76. int zw; // 返回图象的缩放, 若为0, 则不缩放. 
  77. int zh; // 返回图象的缩放, 若为0, 则不缩放.  
  78. int iBitCount; // 要求的位深, 可以是以下一个值 8, 16, 24, 32
  79. DWORD dwImageFormat; // 图象格式标记
  80. DWORD dwFlagEx1; // 保留给特定格式使用
  81. DWORD dwFlagEx2; // 保留给特定格式使用
  82. DWORD dwFlagEx3; // 保留给特定格式使用
  83. DWORD dwFlagEx4; // 保留给特定格式使用
  84. } RCAGETIMAGEDATA, *PRCAGETIMAGEDATA;
  85. // 与 WINDOWS MOUSEINPUT 结构兼容. 使用在 0x40 子协议
  86. typedef struct RCAMouseInput {
  87.     LONG    dx;
  88.     LONG    dy;
  89.     DWORD   mouseData;
  90.     DWORD   dwFlags;
  91.     DWORD   time;
  92.     ULONG_PTR dwExtraInfo;
  93. } RCAMOUSEINPUT, *PRCAMOUSEINPUT;
  94. // 与 WINDOWS KEYBDINPUT 结构兼容. 使用在 0x41 子协议
  95. typedef struct RCAKeybdInput{
  96.     WORD    wVk;
  97.     WORD    wScan;
  98.     DWORD   dwFlags;
  99.     DWORD   time;
  100.     ULONG_PTR dwExtraInfo;
  101. } RCAKEYBDINPUT, *PRCAKEYBDINPUT;
  102. // 定义一个信息结构. 在子协议 0x110 中使用
  103. //
  104. typedef struct RCAComputerInfo {
  105. CHAR pszOS[6]; // WIN95 / WIN98 /  WINNT / WIN2K / WINXP
  106. MEMORYSTATUS memoryStatus; // 由 GlobalMemoryStatus 函数获得
  107. DWORD dwScreenWidth; // 当前显示分辨率的宽
  108. DWORD dwScreenHeight; // ................高
  109. DWORD dwScreenBitCount; // ................位深
  110. } RCACOMPUTERINFO, *PRCACOMPUTERINFO;
  111. //////////////////////////////////////////
  112. //
  113. // 发送数据帮助函数, IO 模型为 event select 
  114. //
  115. // 在调用函数前 SOCKET s 必须被置为异步模式,
  116. // 并且用带有 FD_WRITE 事件通知的标志对其调用了 WSAEventSelect 函数
  117. //
  118. extern "C"
  119. BOOL 
  120. WINAPI RCASend_EventSelectIO(
  121. SOCKET s,
  122. HANDLE hEventArray[2],
  123. char * buf,
  124. int len
  125. );
  126. ////////////////////////////////////////
  127. //
  128. // 接收数据帮助函数, IO 模型为 Async Event
  129. //
  130. // 在调用函数前 SOCKET s 必须被置为异步模式, 
  131. // 并且用带有 FD_READ 事件通知的标志对其调用了 WSAEventSelect 函数
  132. //
  133. extern "C"
  134. BOOL 
  135. WINAPI RCARecv_EventSelectIO( 
  136. SOCKET s,
  137. HANDLE hEventArray[2],
  138. char * buf, // 接收缓冲区 . 若成功
  139. int len // 
  140. );
  141. ///////////////////////////////////////////
  142. //
  143. // 获得整个屏幕的象素信息
  144. //
  145. // 参数: 
  146. //
  147. // pbmi[in,out] -- BITMAPINFO 结构指针, 函数成功调用后会填充这个结构,这个结构反映了象素信息
  148. //
  149. // x, y, w, h;  矩形的左上角座标, 以及宽高. 如果这些参数不合法,将被修整为合法参数
  150. //
  151. // pBits[in,out] -- void 指针, 函数调用成功后,pBits 将被象素值填充. 如果 pBits 为NULL,
  152. // 函数将修改 dwBufferSize 参数, 指明需要多少缓冲存放象素值
  153. //
  154. //  dwBufferSize -- [in, out] 指明 pBits 的大小. 如果函数成功调用后, dwBufferSize 将会被修改, 
  155. // 指明实际拷贝的象素字节数
  156. // 返回值:
  157. //  BOOL 类型, 函数调用成功后, 将返回 TRUE; 失败,将返回 FALSE;
  158. // 
  159. HBITMAP 
  160. WINAPI GetDCPixel_BMP (
  161. HDC hdc,
  162. int  x,
  163. int  y,
  164. int  w,
  165. int  h,
  166. int zw, // 缩放控制, 0 为不缩放
  167. int zh, // 缩放控制, 0 为不缩放
  168. WORD wBitCount,
  169. VOID ** pBits,
  170. BITMAPINFOHEADER * pbmih, // 当色深为 8 时, 包含颜色表
  171. DWORD * pdwBitmapInfoSize
  172. );
  173. ////////////////////////////////////////////////
  174. ////
  175. //
  176. // 从一个 JPEG 格式的像素缓冲区解码,
  177. // 解码后的像素格式为 WINDOWS DIB 格式
  178. //
  179. //  存放 WINDOWS DIB 格式的像素缓冲区由此函数分配,
  180. // 释放交由调用者. 必须用  delete[] 释放
  181. //
  182. BOOL 
  183. WINAPI 
  184. DecodeFromJPEGBuffer(
  185. BYTE * lpJpgBuffer,
  186. DWORD  dwJpgBufferSize,
  187. BYTE** lppRgbBuffer,
  188. DWORD* lpdwWidth,
  189. DWORD* lpdwHeight,
  190. DWORD* lpdwNumberOfChannels
  191. );
  192. ////////////////////////////////////////////////
  193. //
  194. // 从一个 WINDOWS DIB 格式的像素缓冲区编码到一个 JPEG 格式的像素缓冲区
  195. //
  196. // 存放 JPEG 格式的像素缓冲区由此函数分配
  197. // 释放交由调用者, 必须用  delete[] 释放
  198. extern "C"
  199. BOOL 
  200. WINAPI 
  201. EncodeToJPEGBuffer(
  202.  BYTE* lpRgbBuffer,
  203.  DWORD dwWidth,
  204.  DWORD dwHeight,
  205.  BYTE** lppJpgBuffer,
  206.  DWORD* lpdwJpgBufferSize,
  207.  int iQuality // JPEG 图象质量
  208. );
  209. /////////////////////////////////////////////////////
  210. //
  211. // 初始化一个应答头, dwTotalBytes 被初始化为 sizeof(RCARESPONSEHEAD)
  212. //
  213. extern "C"
  214. VOID
  215. WINAPI InitResponseHead(
  216. RCARESPONSEHEADER* prresh,
  217. DWORD dwStatusCode,
  218. DWORD dwSize
  219. );
  220. char * 
  221. WINAPI 
  222. WSAErrorString( 
  223. int error 
  224. );
  225. /////////////////////////////////////////
  226. //
  227. // 创建一个 SOCKET 句柄, 并将其置于事件选择 IO 模式
  228. //
  229. BOOL WINAPI CreateEventSelectSocket( 
  230. SOCKET * s,
  231. HANDLE * hEvent,
  232. LONG     lEventFlags
  233. );
  234. ////////////////////////////////////////
  235. //
  236. // 连接到一个服务器, SOCKET  IO 模型: 事件选择
  237. //
  238. //
  239. BOOL
  240. WINAPI
  241. RCAConnect_EventSelectIO (
  242. SOCKET s,
  243. HANDLE hEventArray[2],
  244. sockaddr * addr,
  245. UINT uMsg
  246. );
  247. /////////////////////////////////////
  248. //
  249. // 初始化一个 RCA 请求头
  250. //
  251. VOID
  252. WINAPI
  253. InitRCARequestHead (
  254. RCAREQUESTHEADER * rreqh,
  255. WORD wMajorVersion, // 主版本号
  256. WORD wMinorVersion, // 次版本号
  257. DWORD dwRequestID,
  258. DWORD dwRequestBytes
  259. );
  260. ///////////////////////////////////////
  261. //
  262. // 向 RCA 服务器请求执行 0x10 号(创建一个进程)操作
  263. //
  264. BOOL 
  265. WINAPI 
  266. RCASendRequest_0X10_EventSelectIO(
  267. SOCKET s,
  268. HANDLE hEventArray[2],
  269. HWND hwnd,
  270. PSTR pOperation,
  271. PSTR pFile,
  272. PSTR pParameters,
  273. PSTR pDirectory,
  274. INT nShowCmd
  275. );
  276. ////////////////////////////////////////////////
  277. //
  278. // 向 RCA 服务器请求执行 0x20 号(截取图象) 操作
  279. //   
  280. //
  281. BOOL
  282. WINAPI
  283. RCASendRequest_0X20_EventSelectIO(
  284. SOCKET s,
  285. HANDLE hEventArray[2],
  286. RCAGETIMAGEDATA * gm
  287. );
  288. ////////////////////////////////////////////////
  289. //
  290. // 当成功发送图象请求数据后, 可以调用这个函数.
  291. // 这个函数接收数据并创建 HBITMAP 
  292. HBITMAP
  293. WINAPI
  294. RCARecvImageData(
  295. SOCKET s,
  296. HANDLE hEventArray[2],
  297. DWORD  dwImageFormat 
  298. );
  299. ////////////////////////////////////////////
  300. //
  301. // 发送鼠标输入数据
  302. //
  303. BOOL
  304. WINAPI
  305. RCASendMouseInput_EventSelectIO(
  306. SOCKET s,
  307. HANDLE hEventArray[2],
  308. BOOL * pbExit,
  309. RCAMOUSEINPUT * pMouseInput,
  310. DWORD dwArraySize
  311. );
  312. ///////////////////////////////////////////
  313. //
  314. // 发送键盘输入数据
  315. //
  316. BOOL
  317. WINAPI
  318. RCASendKeybdInput_EventSelectIO(
  319. SOCKET s,
  320. HANDLE hEventArray[2],
  321. BOOL* pbExit,
  322. RCAKEYBDINPUT * pKeybdInput,
  323. DWORD dwArraySize
  324. );
  325. /////////////////////////////////////////////
  326. //
  327. // 根据消息构造一个 RCAMOUSEINPUT 结构.
  328. BOOL
  329. WINAPI
  330. CreateMouseInput(
  331. RCAMOUSEINPUT* pmi,
  332. UINT msg,
  333. WPARAM w,
  334. LPARAM l,
  335. float fWidthScale,
  336. float fHeightScale
  337. );
  338. ////////////////////////////////////////////
  339. //
  340. // 根据消息构造一个 RCAKEYBDINPUT 结构
  341. //
  342. BOOL
  343. WINAPI
  344. CreateKeybdInput(
  345. RCAKEYBDINPUT* pbi,
  346. UINT msg,
  347. WPARAM w,
  348. LPARAM l
  349. );
  350. #endif