PeeperWnd.cpp
上传用户:xztxsm
上传日期:2007-02-12
资源大小:150k
文件大小:29k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. // 远程控制软件-偷窥者  开发库                                               //
  3. // 日期:2001/10/02                                                           //
  4. // 作者:刘东发                                                               //
  5. // Email:dongfa@yeah.net                                                     //
  6. // http://dongfa.yeah.net                                                    //
  7. // OICQ:5584173  阿东                                                        //
  8. // 作者声明:                                                                 //
  9. //     此部分代码全是作者所写,或以随便传播,但要保持文件的完整性,有问题     //
  10. // 或者意见请来信,谢谢!                                                      //
  11. ///////////////////////////////////////////////////////////////////////////////
  12. #include "stdafx.h"
  13. #include "PeeperWnd.h"
  14. #define USE_DOC // 如果不需要Doc类时,删除此行
  15. #ifdef USE_DOC
  16. #include "PeeperClientDoc.h"
  17. #endif
  18. #ifdef _DEBUG
  19. #define new DEBUG_NEW
  20. #undef THIS_FILE
  21. static char THIS_FILE[] = __FILE__;
  22. #endif
  23. // CGetDIBThread
  24. IMPLEMENT_DYNCREATE(CPeeperThread, CWinThread)
  25. CPeeperThread::CPeeperThread()
  26. {
  27. m_pPeeperWnd = NULL;
  28. m_bAutoDelete = FALSE;
  29. m_szScreen.cx = 1024;
  30. m_szScreen.cx = 768;
  31. }
  32. CPeeperThread::~CPeeperThread()
  33. {
  34. }
  35. BEGIN_MESSAGE_MAP(CPeeperThread, CWinThread)
  36. //{{AFX_MSG_MAP(CGetDIBThread)
  37. //}}AFX_MSG_MAP
  38. ON_THREAD_MESSAGE(PL_GET_DIB_MESSAGE, OnMsgGetDIB)
  39. ON_THREAD_MESSAGE(PL_CONNECT_MESSAGE, OnMsgConnect)
  40. END_MESSAGE_MAP()
  41. HRESULT CPeeperThread::OnMsgConnect(WPARAM, LPARAM)
  42. {
  43. BOOL bRet = FALSE;
  44. do
  45. {
  46. bRet = ::PL_InitSocket();
  47. if(!bRet)
  48. {
  49. break ;
  50. }
  51. if(!m_pPeeperWnd)
  52. {
  53. bRet = FALSE;
  54. break ;
  55. }
  56. int nRet = 0;
  57. sockaddr_in addr;
  58. hostent* pEnt = NULL;
  59. m_pPeeperWnd->m_sckClient[0] = ::socket(AF_INET, SOCK_STREAM, 0);
  60. m_pPeeperWnd->m_sckClient[1] = ::socket(AF_INET, SOCK_STREAM, 0);
  61. TRACE(_T("Client Socket 0 and 1:%d, %d.n"), 
  62. m_pPeeperWnd->m_sckClient[0], m_pPeeperWnd->m_sckClient[1]);
  63. if(m_pPeeperWnd->m_sckClient[0] == INVALID_SOCKET ||
  64. m_pPeeperWnd->m_sckClient[1] == INVALID_SOCKET)
  65. {
  66. bRet = FALSE;
  67. break ;
  68. }
  69. pEnt = ::gethostbyname(m_pPeeperWnd->m_strIP);
  70. if(!pEnt)
  71. {
  72. bRet = FALSE;
  73. break ;
  74. }
  75. addr.sin_family = AF_INET;
  76. addr.sin_port = ::htons((u_short)(m_pPeeperWnd->m_uPort));
  77. addr.sin_addr.S_un.S_un_b.s_b1 = pEnt->h_addr_list[0][0];
  78. addr.sin_addr.S_un.S_un_b.s_b2 = pEnt->h_addr_list[0][1];
  79. addr.sin_addr.S_un.S_un_b.s_b3 = pEnt->h_addr_list[0][2];
  80. addr.sin_addr.S_un.S_un_b.s_b4 = pEnt->h_addr_list[0][3];
  81. bRet = FALSE; // default
  82. for(int i = 0; i < 3; i ++)
  83. {
  84. int nRet1 = ::connect(m_pPeeperWnd->m_sckClient[0], 
  85. (sockaddr*)&addr, sizeof(addr));
  86. if(nRet1 != SOCKET_ERROR)
  87. {
  88. BYTE chData[5];
  89. ZeroMemory(chData, 5);
  90. ::PL_ReadSocketData(m_pPeeperWnd->m_sckClient[0], chData, 5, NULL);
  91. }
  92. else
  93. {
  94. TRACE(_T("Socket Error Code = %d.n"), ::WSAGetLastError());
  95. }
  96. TRACE(_T("Client[0] is: %s.n"), (nRet1 == 0)?_T("Ok"):_T("Failed."));
  97. int nRet2 = ::connect(m_pPeeperWnd->m_sckClient[1], 
  98. (sockaddr*)&addr, sizeof(addr));
  99. if(nRet2 == SOCKET_ERROR)
  100. {
  101. TRACE(_T("Socket Error Code = %d.n"), ::WSAGetLastError());
  102. }
  103. TRACE(_T("Client[1] is: %s.n"), (nRet2 == 0)?_T("Ok"):_T("Failed."));
  104. if(nRet1 == SOCKET_ERROR ||
  105. nRet2 == SOCKET_ERROR)
  106. {
  107. Sleep(2000);
  108. continue ;
  109. }
  110. char chConnectInfo[512];
  111. ZeroMemory(chConnectInfo, 512);
  112. int nRet = ::PL_ReadSocketData(m_pPeeperWnd->m_sckClient[0], 
  113. (BYTE *)chConnectInfo, 512, NULL);
  114. m_pPeeperWnd->SetConnectInfo(chConnectInfo);
  115. bRet = TRUE; // Connect Ok!
  116. break ;
  117. }
  118. }while(0);
  119. if(m_pPeeperWnd)
  120. {
  121. DWORD dwFlag = PL_PEEPER_NOTIFY_DISCONNECT;
  122. if(bRet)
  123. {
  124. dwFlag = PL_PEEPER_NOTIFY_CONNECT;
  125. }
  126. ::SendMessage(m_pPeeperWnd->GetSafeHwnd(), 
  127. PL_CONNECT_MESSAGE, (WPARAM)PL_CONNECT_MESSAGE, (LPARAM)dwFlag);
  128. }
  129. return bRet ? S_OK : E_FAIL;
  130. }
  131. HRESULT CPeeperThread::OnMsgGetDIB(WPARAM, LPARAM)
  132. {
  133. int nRet = INVALID_SOCKET;
  134. DWORD d1 = ::GetTickCount();
  135. if(m_pPeeperWnd && (m_pPeeperWnd->m_sckClient[1] != INVALID_SOCKET))
  136. {
  137. BYTE chData[20];
  138. ZeroMemory(chData, 20);
  139. //发送颜色位数和压缩类型
  140. PL_ColorType ctColor = m_pPeeperWnd->GetColorType();
  141. memcpy(chData, &ctColor, sizeof(PL_ColorType));
  142. PL_ZipType ztZip = m_pPeeperWnd->GetZipType();
  143. memcpy(chData+sizeof(PL_ColorType), &ztZip, sizeof(PL_ZipType));
  144. nRet = ::PL_SendSocketData(m_pPeeperWnd->m_sckClient[1], 
  145. chData, sizeof(PL_ColorType) + sizeof(PL_ZipType));
  146. //读取图像大小
  147. ZeroMemory(chData, 20);
  148. nRet = ::PL_ReadSocketData(m_pPeeperWnd->m_sckClient[1], chData, 20, NULL);
  149. if(nRet > 0)
  150. {
  151. int nSize = *((int*)(chData+1));
  152. int cx = *((int*)(chData+1+sizeof(int)));
  153. int cy = *((int*)(chData+1+sizeof(int)*2));
  154. m_szScreen.cx = cx;
  155. m_szScreen.cy = cy;
  156. if(m_pPeeperWnd->m_hDib)
  157. {
  158. ::GlobalFree(m_pPeeperWnd->m_hDib);
  159. }
  160. m_pPeeperWnd->m_hDib = (HDIB)::GlobalAlloc(GPTR, nSize);
  161. LPBYTE lpData = (LPBYTE)::GlobalLock(m_pPeeperWnd->m_hDib);
  162. int nRead = 0;
  163. while(nRead < nSize)
  164. {
  165. int nBytes = ::PL_ReadSocketData(m_pPeeperWnd->m_sckClient[1], 
  166. (BYTE *)(lpData+nRead), PL_SOCKET_MAXBYTES, NULL);
  167. nRead += (nBytes);
  168. }
  169. ::GlobalUnlock(m_pPeeperWnd->m_hDib);
  170. if(nRead == (int)::GlobalSize(m_pPeeperWnd->m_hDib))
  171. {
  172. ::PostMessage(m_pPeeperWnd->GetSafeHwnd(), 
  173. PL_GET_DIB_MESSAGE, (WPARAM)PL_GET_DIB_MESSAGE, (LPARAM)ztZip);
  174. }
  175. }
  176. }
  177. TRACE(_T("Get data times:%d(ms).nGet data sizes:%d(bytes).n"),
  178. ::GetTickCount() - d1, ::GlobalSize(m_pPeeperWnd->m_hDib));
  179. return nRet;
  180. }
  181. IMPLEMENT_DYNCREATE(CPeeperWnd, CScrollView)
  182. CPeeperWnd::CPeeperWnd(CWnd *pNotifyWnd)
  183. {
  184. m_pNotifyWnd = pNotifyWnd;
  185. m_strIP = _T("127.0.0.1");
  186. m_uPort = 0;
  187. m_hDib = NULL;
  188. m_nBits = 4;
  189. m_szScreen.cx = 1024;
  190. m_szScreen.cy = 768;
  191. m_nTimerID = PL_DIB_TIMERID;
  192. m_nSpeed = PL_DIB_TIMER;
  193. m_sckClient[0] = INVALID_SOCKET;
  194. m_sckClient[1] = INVALID_SOCKET;
  195. m_bIsDoing = FALSE;
  196. ZeroMemory(m_chConnectInfo, 512);
  197. strcpy(m_chConnectInfo, "Not Connected.");
  198. m_nRetryTime = ::GetTickCount();
  199. m_nLastUpdateTime = ::GetTickCount();
  200. m_bIsPause = FALSE;
  201. m_dwEnableFlag = PL_ENABLE_ALL;
  202. m_ctColor = color_4;
  203. m_ztZip = zip_none;
  204. m_strState = _T("开始连接...");
  205. m_nConnectTime = 0;
  206. m_bIsConnect = FALSE;
  207. }
  208. CPeeperWnd::~CPeeperWnd()
  209. {
  210. ExitConnect();
  211. ::PL_TermSocket();
  212. }
  213. BEGIN_MESSAGE_MAP(CPeeperWnd, CScrollView)
  214. //{{AFX_MSG_MAP(CPeeperWnd)
  215. ON_WM_CREATE()
  216. ON_WM_LBUTTONDBLCLK()
  217. ON_WM_LBUTTONDOWN()
  218. ON_WM_LBUTTONUP()
  219. ON_WM_RBUTTONDBLCLK()
  220. ON_WM_RBUTTONDOWN()
  221. ON_WM_RBUTTONUP()
  222. ON_WM_MOUSEMOVE()
  223. ON_WM_TIMER()
  224. ON_WM_DESTROY()
  225. ON_WM_KEYDOWN()
  226. ON_WM_KEYUP()
  227. ON_WM_SYSKEYDOWN()
  228. ON_WM_SYSKEYUP()
  229. //}}AFX_MSG_MAP
  230. ON_MESSAGE(PL_GET_DIB_MESSAGE, OnMsgPeeperThread)
  231. ON_MESSAGE(PL_CONNECT_MESSAGE, OnMsgPeeperThread)
  232. END_MESSAGE_MAP()
  233. //返回偷窥者客户端的版本
  234. CString CPeeperWnd::GetClientVersion()
  235. {
  236. return PEEPER_SERVER_VER_15;
  237. }
  238. BOOL CPeeperWnd::Create(CString strIP, UINT uPort, CWnd * pParent, int nBits, UINT nTimer)
  239. {
  240. m_strIP = strIP;
  241. m_uPort = uPort;
  242. m_nBits = nBits;
  243. m_nSpeed = nTimer;
  244. LPCTSTR lpszPeeperClass = AfxRegisterWndClass(0);
  245. BOOL bRet =  CWnd::CreateEx(0, lpszPeeperClass, NULL, 
  246. WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 
  247. CRect(100, 100, 200, 150), pParent, NULL);
  248. return bRet;
  249. }
  250. void CPeeperWnd::SetNotifyWnd(CWnd *pNotifyWnd)
  251. {
  252. m_pNotifyWnd = pNotifyWnd;
  253. }
  254. void CPeeperWnd::SetBits(int nBits)
  255. {
  256. m_nBits = nBits;
  257. SendDIBBits();
  258. }
  259. void CPeeperWnd::SetUpdateSpeed(UINT nTimer)
  260. {
  261. m_nSpeed = nTimer;
  262. KillTimer(m_nTimerID);
  263. SetTimer(m_nTimerID, m_nSpeed, NULL);
  264. }
  265. int CPeeperWnd::SendData(BYTE *chData, int nLen, BYTE chFlag)
  266. {
  267. int nRet = INVALID_SOCKET;
  268. if(m_sckClient[0] != INVALID_SOCKET)
  269. {
  270. nRet = ::PL_SendSocketData(m_sckClient[0], chData, nLen, chFlag);
  271. }
  272. return nRet;
  273. }
  274. int CPeeperWnd::ReadData(BYTE *chData, int nLen, BYTE *chFlag)
  275. {
  276. int nRet = INVALID_SOCKET;
  277. if(m_sckClient[0] != INVALID_SOCKET)
  278. {
  279. nRet = ::PL_ReadSocketData(m_sckClient[0], chData, nLen, chFlag);
  280. }
  281. return nRet;
  282. }
  283. BOOL CPeeperWnd::CanSend()
  284. {
  285. return (m_sckClient[0] != INVALID_SOCKET) && (!m_bIsPause);
  286. }
  287. void CPeeperWnd::Pause()
  288. {
  289. m_bIsPause = TRUE;
  290. }
  291. BOOL CPeeperWnd::IsPause()
  292. {
  293. return m_bIsPause;
  294. }
  295. void CPeeperWnd::Resume()
  296. {
  297. m_bIsPause = FALSE;
  298. }
  299. DWORD CPeeperWnd::SetEnableFlag(DWORD dwFlag)
  300. {
  301. DWORD dwRet = m_dwEnableFlag;
  302. m_dwEnableFlag = dwFlag;
  303. return dwRet;
  304. }
  305. DWORD CPeeperWnd::SetEnableFlag(DWORD dwFlag, BOOL bSet)
  306. {
  307. DWORD dwRet = m_dwEnableFlag;
  308. m_dwEnableFlag |= dwFlag;
  309. if(!bSet)
  310. {
  311. m_dwEnableFlag ^= dwFlag;
  312. }
  313. return dwRet;
  314. }
  315. DWORD CPeeperWnd::GetEnableFlag()
  316. {
  317. return m_dwEnableFlag;
  318. }
  319. BOOL CPeeperWnd::GetEnableFlag(DWORD dwEvent)
  320. {
  321. return ((GetEnableFlag() & dwEvent) == dwEvent);
  322. }
  323. POINT CPeeperWnd::GetMousePoint(BYTE *chData)
  324. {
  325. POINT pt1, pt2, point;
  326. ::GetCursorPos(&pt1);
  327. pt2 = GetOffsetPos();
  328. pt1.x = pt1.x + pt2.x;
  329. pt1.y = pt1.y + pt2.y;
  330. CDC *pDC = GetDC();
  331. GetDCOrgEx(pDC->GetSafeHdc(), &pt2);
  332. point.x = pt1.x - pt2.x;
  333. point.y = pt1.y - pt2.y;
  334. if(AfxIsValidAddress(chData, 12))
  335. {
  336. int cx = point.x;
  337. int cy = point.y;
  338. ZeroMemory(chData, 12);
  339. memcpy(chData, &cx, sizeof(int));
  340. memcpy(chData+sizeof(int), &cy, sizeof(int));
  341. }
  342. return point;
  343. }
  344. CPoint CPeeperWnd::GetOffsetPos(BOOL bScroll)
  345. {
  346. CPoint pt = GetScrollPosition();
  347. CPoint point = CPoint(0, 0);
  348. CRect rect;
  349. GetClientRect(&rect);
  350. if(rect.Width() > m_szScreen.cx)
  351. {
  352. point.x = ((rect.Width() - m_szScreen.cx)/2);
  353. }
  354. if(rect.Height() > m_szScreen.cy)
  355. {
  356. point.y = ((rect.Height() - m_szScreen.cy)/2);
  357. }
  358. if(bScroll)
  359. {
  360. pt.x -= point.x;
  361. pt.y -= point.y;
  362. }
  363. else
  364. {
  365. pt = point;
  366. }
  367. return pt;
  368. }
  369. int CPeeperWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  370. {
  371. if (CScrollView::OnCreate(lpCreateStruct) == -1)
  372. return -1;
  373. m_hPeeperThread.m_pPeeperWnd = this;
  374. m_hPeeperThread.CreateThread();
  375. ModifyStyleEx(WS_EX_CLIENTEDGE, 0);
  376. return 0;
  377. }
  378. void CPeeperWnd::OnInitialUpdate()
  379. {
  380. CScrollView::OnInitialUpdate();
  381. SetScrollSizes(MM_TEXT, CSize(0, 0));
  382. #ifdef USE_DOC
  383. if(m_pDocument)
  384. {
  385. m_strIP = ((CPeeperClientDoc *)m_pDocument)->m_strIP;
  386. m_uPort = ((CPeeperClientDoc *)m_pDocument)->m_uPort;
  387. m_nBits = ((CPeeperClientDoc *)m_pDocument)->m_nBits;
  388. m_nSpeed = ((CPeeperClientDoc *)m_pDocument)->m_nSpeed;
  389. CString str;
  390. str.Format(_T("偷窥者窗口--[IP/Name:%s  Port:%d]"), m_strIP, m_uPort);
  391. m_pDocument->SetTitle(str);
  392. }
  393. #else
  394. //不使用Doc类时,可以在这里增加参数的设置
  395. #endif
  396. if(!m_strIP.IsEmpty())
  397. {
  398. ConnectServer();
  399. }
  400. }
  401. void CPeeperWnd::OnDraw(CDC* pDC)
  402. {
  403. CRect rect;
  404. GetClientRect(&rect);
  405. if((m_memDC.m_hDC == NULL) || 
  406. (rect.right > m_szScreen.cx || rect.bottom > m_szScreen.cy))
  407. {
  408. rect.right = max(rect.right, m_szScreen.cx);
  409. rect.bottom = max(rect.bottom, m_szScreen.cy);
  410. pDC->FillSolidRect(rect, RGB(0, 100, 150));
  411. }
  412. if(m_memDC.m_hDC != NULL)
  413. {
  414. CPoint pt = GetOffsetPos(FALSE);
  415. pDC->BitBlt(pt.x, pt.y, m_szScreen.cx, m_szScreen.cy, &m_memDC, 0, 0, SRCCOPY);
  416. }
  417. else
  418. {
  419. CFont font;
  420. font.CreatePointFont(120, _T("宋体"));
  421. CFont *old = pDC->SelectObject(&font);
  422. CRect rc;
  423. GetClientRect(&rc);
  424. pDC->SetTextColor(RGB(255, 255, 255));
  425. pDC->DrawText(m_strState, rc, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
  426. pDC->SelectObject(old);
  427. }
  428. }
  429. void CPeeperWnd::DrawDIB()
  430. {
  431. if(m_hDib && ::IsWindow(m_hWnd))
  432. {
  433. CClientDC dc(this);
  434. if(m_hPeeperThread.m_szScreen.cx != m_szScreen.cx ||
  435. m_hPeeperThread.m_szScreen.cy != m_szScreen.cy)
  436. {
  437. m_szScreen.cx = m_hPeeperThread.m_szScreen.cx;
  438. m_szScreen.cy = m_hPeeperThread.m_szScreen.cy;
  439. if(m_memDC.m_hDC)
  440. {
  441. m_memDC.DeleteDC();
  442. }
  443. m_memDC.CreateCompatibleDC(NULL);
  444. CBitmap bmp;
  445. bmp.CreateCompatibleBitmap(&dc, m_szScreen.cx, m_szScreen.cy);
  446. m_memDC.SelectObject(&bmp);
  447. SetScrollSizes(MM_TEXT, CSize(m_szScreen.cx, m_szScreen.cy));
  448. Invalidate();
  449. UpdateWindow();
  450. }
  451. else
  452. {
  453. if(!m_memDC.m_hDC)
  454. {
  455. m_memDC.CreateCompatibleDC(NULL);
  456. CBitmap bmp;
  457. CClientDC dc(this);
  458. bmp.CreateCompatibleBitmap(&dc, m_szScreen.cx, m_szScreen.cy);
  459. m_memDC.SelectObject(&bmp);
  460. SetScrollSizes(MM_TEXT, CSize(m_szScreen.cx, m_szScreen.cy));
  461. }
  462. }
  463. ::PL_DrawDIB(m_memDC.m_hDC, NULL, m_hDib, NULL, NULL);
  464. m_memDC.Draw3dRect(CRect(0, 0, m_szScreen.cx, m_szScreen.cy), 
  465. RGB(255, 255, 255), RGB(80, 80, 80));
  466. #ifdef USE_DOC
  467. //设置文件标题
  468. CString str;
  469. str.Format(_T("偷窥者窗口--[IP/Name:%s  Port:%d,  Refresh Time:%.3f(S/T)]"),
  470. m_strIP, m_uPort, ((float)(::GetTickCount() - m_nLastUpdateTime))/1000.0f);
  471. if(m_pDocument)
  472. {
  473. m_pDocument->SetTitle(str);
  474. }
  475. #endif 
  476. CPoint pt = GetOffsetPos();
  477. dc.BitBlt(-pt.x, -pt.y, m_szScreen.cx, m_szScreen.cy, &m_memDC, 0, 0, SRCCOPY);
  478. m_strState = _T("连接完毕");
  479. }
  480. m_bIsDoing = FALSE;
  481. m_nLastUpdateTime = ::GetTickCount();
  482. }
  483. BOOL CPeeperWnd::PreTranslateMessage(MSG* pMsg) 
  484. {
  485. return CScrollView::PreTranslateMessage(pMsg);
  486. }
  487. void CPeeperWnd::OnLButtonDblClk(UINT nFlags, CPoint point) 
  488. {
  489. if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_LDBLCLK))
  490. {
  491. BYTE chData[20];
  492. GetMousePoint(chData);
  493. BOOL bMouseMove = GetEnableFlag(PL_ENABLE_MOUSE_MOVE);
  494. bMouseMove = !bMouseMove;
  495. memcpy(chData+sizeof(int)*2, &bMouseMove, sizeof(BOOL));
  496. int nRet = ::PL_SendSocketData(m_sckClient[0], chData, 
  497. sizeof(int)*2+sizeof(BOOL), PL_MOUSE_LDBLCLK);
  498. if(nRet <= 0)
  499. {
  500. ExitConnect();
  501. return ;
  502. }
  503. nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL);
  504. return ;
  505. }
  506. CScrollView::OnLButtonDblClk(nFlags, point);
  507. }
  508. void CPeeperWnd::OnLButtonDown(UINT nFlags, CPoint point) 
  509. {
  510. if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_LBUTTON))
  511. {
  512. BYTE chData[20];
  513. GetMousePoint(chData);
  514. BOOL bMouseMove = GetEnableFlag(PL_ENABLE_MOUSE_MOVE);
  515. bMouseMove = !bMouseMove;
  516. memcpy(chData+sizeof(int)*2, &bMouseMove, sizeof(BOOL));
  517. int nRet = ::PL_SendSocketData(m_sckClient[0], chData, 
  518. sizeof(int)*2+sizeof(BOOL), PL_MOUSE_LBUTTONDOWN);
  519. if(nRet <= 0)
  520. {
  521. ExitConnect();
  522. return ;
  523. }
  524. nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL);
  525. return ;
  526. }
  527. CScrollView::OnLButtonDown(nFlags, point);
  528. }
  529. void CPeeperWnd::OnLButtonUp(UINT nFlags, CPoint point) 
  530. {
  531. if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_LBUTTON))
  532. {
  533. BYTE chData[20];
  534. GetMousePoint(chData);
  535. BOOL bMouseMove = GetEnableFlag(PL_ENABLE_MOUSE_MOVE);
  536. bMouseMove = !bMouseMove;
  537. memcpy(chData+sizeof(int)*2, &bMouseMove, sizeof(BOOL));
  538. int nRet = ::PL_SendSocketData(m_sckClient[0], chData, 
  539. sizeof(int)*2+sizeof(BOOL), PL_MOUSE_LBUTTONUP);
  540. if(nRet <= 0)
  541. {
  542. ExitConnect();
  543. return ;
  544. }
  545. nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL);
  546. return ;
  547. }
  548. CScrollView::OnLButtonUp(nFlags, point);
  549. }
  550. void CPeeperWnd::OnRButtonDblClk(UINT nFlags, CPoint point) 
  551. {
  552. if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_RDBLCLK))
  553. {
  554. BYTE chData[20];
  555. GetMousePoint(chData);
  556. BOOL bMouseMove = GetEnableFlag(PL_ENABLE_MOUSE_MOVE);
  557. bMouseMove = !bMouseMove;
  558. memcpy(chData+sizeof(int)*2, &bMouseMove, sizeof(BOOL));
  559. int nRet = ::PL_SendSocketData(m_sckClient[0], chData, 
  560. sizeof(int)*2+sizeof(BOOL), PL_MOUSE_RDBLCLK);
  561. if(nRet <= 0)
  562. {
  563. ExitConnect();
  564. return ;
  565. }
  566. nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL);
  567. return ;
  568. }
  569. CScrollView::OnRButtonDblClk(nFlags, point);
  570. }
  571. void CPeeperWnd::OnRButtonDown(UINT nFlags, CPoint point) 
  572. {
  573. if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_RBUTTON))
  574. {
  575. BYTE chData[20];
  576. GetMousePoint(chData);
  577. BOOL bMouseMove = GetEnableFlag(PL_ENABLE_MOUSE_MOVE);
  578. bMouseMove = !bMouseMove;
  579. memcpy(chData+sizeof(int)*2, &bMouseMove, sizeof(BOOL));
  580. int nRet = ::PL_SendSocketData(m_sckClient[0], chData, 
  581. sizeof(int)*2+sizeof(BOOL), PL_MOUSE_RBUTTONDOWN);
  582. if(nRet <= 0)
  583. {
  584. ExitConnect();
  585. return ;
  586. }
  587. nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL);
  588. return ;
  589. }
  590. CScrollView::OnRButtonDown(nFlags, point);
  591. }
  592. void CPeeperWnd::OnRButtonUp(UINT nFlags, CPoint point) 
  593. {
  594. if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_RBUTTON))
  595. {
  596. BYTE chData[20];
  597. GetMousePoint(chData);
  598. BOOL bMouseMove = GetEnableFlag(PL_ENABLE_MOUSE_MOVE);
  599. bMouseMove = !bMouseMove;
  600. memcpy(chData+sizeof(int)*2, &bMouseMove, sizeof(BOOL));
  601. int nRet = ::PL_SendSocketData(m_sckClient[0], chData, 
  602. sizeof(int)*2+sizeof(BOOL), PL_MOUSE_RBUTTONUP);
  603. if(nRet <= 0)
  604. {
  605. ExitConnect();
  606. return ;
  607. }
  608. nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL);
  609. return ;
  610. }
  611. CScrollView::OnRButtonUp(nFlags, point);
  612. }
  613. void CPeeperWnd::OnMouseMove(UINT nFlags, CPoint point) 
  614. {
  615. if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_MOVE))
  616. {
  617. BYTE chData[20];
  618. GetMousePoint(chData);
  619. int nRet = ::PL_SendSocketData(m_sckClient[0], chData, 
  620. sizeof(int)*2, PL_MOUSE_MOVE);
  621. if(nRet <= 0)
  622. {
  623. ExitConnect();
  624. return ;
  625. }
  626. nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL);
  627. return ;
  628. }
  629. CScrollView::OnMouseMove(nFlags, point);
  630. }
  631. void CPeeperWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  632. {
  633. if(CanSend() && (((BYTE)nChar != VK_LWIN && (BYTE)nChar != VK_RWIN)) &&
  634. GetEnableFlag(PL_ENABLE_KEY))
  635. {
  636. BYTE chTemp[15];
  637. ZeroMemory(chTemp, 15);
  638. memcpy(chTemp, &nChar, sizeof(UINT));
  639. memcpy(chTemp+sizeof(UINT), &nFlags, sizeof(UINT));
  640. int nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)*2, PL_KEY_DOWN);
  641. if(nRet <= 0)
  642. {
  643. ExitConnect();
  644. return ;
  645. }
  646. nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 2, NULL);
  647. return ;
  648. }   
  649. CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
  650. }
  651. void CPeeperWnd::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
  652. {
  653. if(CanSend() && (((BYTE)nChar != VK_LWIN && (BYTE)nChar != VK_RWIN)) &&
  654. GetEnableFlag(PL_ENABLE_KEY))
  655. {
  656. BYTE chTemp[15];
  657. ZeroMemory(chTemp, 15);
  658. memcpy(chTemp, &nChar, sizeof(UINT));
  659. memcpy(chTemp+sizeof(UINT), &nFlags, sizeof(UINT));
  660. int nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)*2, PL_KEY_UP);
  661. if(nRet <= 0)
  662. {
  663. ExitConnect();
  664. return ;
  665. }
  666. nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 2, NULL);
  667. return ;
  668. }
  669. CScrollView::OnKeyUp(nChar, nRepCnt, nFlags);
  670. }
  671. void CPeeperWnd::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  672. {
  673. if(CanSend() && (((BYTE)nChar != VK_LWIN && (BYTE)nChar != VK_RWIN)) &&
  674. GetEnableFlag(PL_ENABLE_KEY))
  675. {
  676. BYTE chTemp[15];
  677. ZeroMemory(chTemp, 15);
  678. memcpy(chTemp, &nChar, sizeof(UINT));
  679. memcpy(chTemp+sizeof(UINT), &nFlags, sizeof(UINT));
  680. int nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)*2, PL_KEY_DOWN);
  681. if(nRet <= 0)
  682. {
  683. ExitConnect();
  684. return ;
  685. }
  686. nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 2, NULL);
  687. return ;
  688. }
  689. CScrollView::OnSysKeyDown(nChar, nRepCnt, nFlags);
  690. }
  691. void CPeeperWnd::OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
  692. {
  693. if(CanSend() && (((BYTE)nChar != VK_LWIN && (BYTE)nChar != VK_RWIN)) &&
  694. GetEnableFlag(PL_ENABLE_KEY))
  695. {
  696. BYTE chTemp[15];
  697. ZeroMemory(chTemp, 15);
  698. memcpy(chTemp, &nChar, sizeof(UINT));
  699. memcpy(chTemp+sizeof(UINT), &nFlags, sizeof(UINT));
  700. int nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)*2, PL_KEY_UP);
  701. if(nRet <= 0)
  702. {
  703. ExitConnect();
  704. return ;
  705. }
  706. nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 2, NULL);
  707. return ;
  708. }
  709. CScrollView::OnSysKeyUp(nChar, nRepCnt, nFlags);
  710. }
  711. void CPeeperWnd::OnTimer(UINT nIDEvent) 
  712. {
  713. if(nIDEvent == m_nTimerID)
  714. {
  715. if(m_sckClient[0] == INVALID_SOCKET ||
  716.    m_sckClient[1] == INVALID_SOCKET)
  717. {
  718. if((::GetTickCount() - m_nRetryTime) > (int)(PL_SOCKET_RETRYTIME))
  719. {
  720. ConnectServer();
  721. m_nRetryTime = ::GetTickCount();
  722. }
  723. }
  724. if(!m_bIsDoing && CanSend() && GetEnableFlag(PL_ENABLE_DIB))
  725. {
  726. m_bIsDoing = TRUE;
  727. ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_DIB);
  728. m_hPeeperThread.PostThreadMessage(PL_GET_DIB_MESSAGE, 0, 0);
  729. }
  730. }
  731. CScrollView::OnTimer(nIDEvent);
  732. }
  733. char *CPeeperWnd::GetConnectInfo()
  734. {
  735. return m_chConnectInfo;
  736. }
  737. void CPeeperWnd::SetConnectInfo(char *chInfo)
  738. {
  739. strncpy(m_chConnectInfo, chInfo, 510);
  740. }
  741. BOOL CPeeperWnd::CloseServer()
  742. {
  743. BOOL bRet = FALSE;
  744. if(GetState())
  745. {
  746. int nRet = SendData(NULL, 0, PL_CLOSE_PEEPER);
  747. bRet = nRet > 0;
  748. ExitConnect();
  749. }
  750. return FALSE;
  751. }
  752. BOOL CPeeperWnd::ConnectServer()
  753. {
  754. BOOL bRet = FALSE;
  755. if(m_hPeeperThread.m_hThread != NULL)
  756. {
  757. m_hPeeperThread.PostThreadMessage(PL_CONNECT_MESSAGE, 0, 0);
  758. bRet = TRUE;
  759. }
  760. return bRet;
  761. }
  762. BOOL CPeeperWnd::GetState()
  763. {
  764. if((!m_bIsConnect) || 
  765. (m_sckClient[0] == INVALID_SOCKET || 
  766. m_sckClient[1] == INVALID_SOCKET))
  767. {
  768. return FALSE;
  769. }
  770. return TRUE;
  771. }
  772. CString CPeeperWnd::GetClientInfo()
  773. {
  774. return m_strState;
  775. }
  776. UINT CPeeperWnd::GetConnectTime()
  777. {
  778. return GetState()?((GetTickCount() - m_nConnectTime)/1000) : 0;
  779. }
  780. BOOL CPeeperWnd::ExitConnect()
  781. {
  782. if(m_sckClient[0] != INVALID_SOCKET)
  783. {
  784. ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_CLIENT_CLOSE);
  785. ::closesocket(m_sckClient[0]);
  786. }
  787. if(m_sckClient[1] != INVALID_SOCKET)
  788. {
  789. ::closesocket(m_sckClient[1]);
  790. }
  791. m_sckClient[0] = INVALID_SOCKET;
  792. m_sckClient[1] = INVALID_SOCKET;
  793. if(m_pNotifyWnd)
  794. {
  795. ::PostMessage(m_pNotifyWnd->GetSafeHwnd(), PL_PEEPER_NOTIFY, 
  796. (WPARAM)PL_PEEPER_NOTIFY_DISCONNECT, (LPARAM)this);
  797. }
  798. return TRUE;
  799. }
  800. int CPeeperWnd::GetScreenSize()
  801. {
  802. int nRet = ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_SCREEN_SIZE);
  803. if(nRet > 0)
  804. {
  805. BYTE chTemp[20];
  806. ZeroMemory(chTemp, 20);
  807. nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 20, 0);
  808. if(nRet > 0)
  809. {
  810. m_szScreen.cx = *((int*)(chTemp));
  811. m_szScreen.cy = *((int*)(chTemp+sizeof(int)));
  812. }
  813. }
  814. if(nRet <= 0)
  815. {
  816. ExitConnect();
  817. }
  818. return nRet;
  819. }
  820. int CPeeperWnd::SendDIBBits()
  821. {
  822. int nRet = INVALID_SOCKET;
  823. if(CanSend())
  824. {
  825. nRet = ::PL_SendSocketData(m_sckClient[0], (BYTE *)&m_nBits, sizeof(int), PL_DIB_BITS);
  826. if(nRet <= 0)
  827. {
  828. ExitConnect();
  829. }
  830. }
  831. return nRet;
  832. }
  833. HRESULT CPeeperWnd::OnMsgPeeperThread(WPARAM wParam, LPARAM lParam)
  834. {
  835. DWORD dwMessage = (DWORD)wParam;
  836. BYTE chFlag = (BYTE)lParam;
  837. DWORD dwFlag = (DWORD)lParam;
  838. switch(dwMessage)
  839. {
  840. case PL_GET_DIB_MESSAGE:
  841. {
  842. switch((PL_ZipType)dwFlag)
  843. {
  844. case zip_none:
  845. {
  846. ;//not to do
  847. }
  848. break ;
  849. case zip_lz77:
  850. {
  851. HDIB hDib = (HDIB)::PL_LZ77_UnZip(m_hDib);
  852. ::GlobalFree(m_hDib);
  853. m_hDib = hDib;
  854. }
  855. break ;
  856. case zip_lzw:
  857. {
  858. HDIB hDib = (HDIB)::PL_LZW_UnZip(m_hDib);
  859. ::GlobalFree(m_hDib);
  860. m_hDib = hDib;
  861. }
  862. break ;
  863. case zip_jpeg:
  864. {
  865. }
  866. break; 
  867. case zip_lzss:
  868. {
  869. HDIB hDib = (HDIB)::PL_LZSS_UnZip(m_hDib);
  870. ::GlobalFree(m_hDib);
  871. m_hDib = hDib;
  872. }
  873. break ;
  874. case zip_ari:
  875. {
  876. HDIB hDib = (HDIB)::PL_ARI_UnZip(m_hDib);
  877. ::GlobalFree(m_hDib);
  878. m_hDib = hDib;
  879. }
  880. break ;
  881. default :
  882. {
  883. return S_OK;
  884. }
  885. }
  886. DrawDIB();
  887. return S_OK;
  888. }
  889. break ;
  890. case PL_CONNECT_MESSAGE:
  891. {
  892. switch(dwFlag)
  893. {
  894. case PL_PEEPER_NOTIFY_CONNECT:
  895. {
  896. m_nConnectTime = ::GetTickCount();
  897. m_strState = _T("成功连接,开始接收桌面图像...");
  898. Invalidate();
  899. UpdateWindow();
  900. TRACE(m_chConnectInfo);
  901. TRACE(_T("n"));
  902. m_bIsDoing = FALSE;
  903. KillTimer(m_nTimerID);
  904. SetTimer(m_nTimerID, m_nSpeed, NULL);
  905. if(m_pNotifyWnd)
  906. {
  907. ::PostMessage(m_pNotifyWnd->GetSafeHwnd(), PL_PEEPER_NOTIFY, 
  908. (WPARAM)PL_PEEPER_NOTIFY_CONNECT, (LPARAM)this);
  909. }
  910. m_bIsConnect = TRUE;
  911. }
  912. break ;
  913. case PL_PEEPER_NOTIFY_DISCONNECT:
  914. {
  915. m_bIsConnect = FALSE;
  916. m_strState = _T("连接失败,开始重试...");
  917. if(m_memDC.m_hDC == NULL)
  918. {
  919. Invalidate();
  920. UpdateWindow();
  921. }
  922. ExitConnect();
  923. m_nConnectTime = ::GetTickCount();
  924. KillTimer(m_nTimerID);
  925. SetTimer(m_nTimerID, m_nSpeed, NULL);
  926. }
  927. break ;
  928. default :
  929. {
  930. ExitConnect();
  931. }
  932. break ;
  933. }
  934. return S_OK;
  935. }
  936. break ;
  937. }
  938. return S_OK;
  939. }
  940. void CPeeperWnd::OnDestroy() 
  941. {
  942. ExitConnect();
  943. if(::IsWindow(m_hWnd))
  944. {
  945. KillTimer(m_nTimerID);
  946. }
  947. if(m_hPeeperThread.m_hThread != NULL)
  948. {
  949. ::TerminateThread(m_hPeeperThread.m_hThread, 0xDB);
  950. ::WaitForSingleObject(m_hPeeperThread.m_hThread, INFINITE);
  951. m_hPeeperThread.m_hThread = NULL;
  952. TRACE(_T("Peeper Thread Exit.n"));
  953. }
  954. if(m_pNotifyWnd)
  955. {
  956. ::PostMessage(m_pNotifyWnd->GetSafeHwnd(), PL_PEEPER_NOTIFY, 
  957. (WPARAM)PL_PEEPER_NOTIFY_CLOSE, (LPARAM)this);
  958. }
  959. CScrollView::OnDestroy();
  960. }
  961. // tools function
  962. BOOL CPeeperWnd::T_RunCommand(char *chCommand)
  963. {
  964. BOOL bRet = FALSE;
  965. BOOL bPause = IsPause();
  966. if(!bPause)  Pause();
  967. if(m_sckClient[0] != INVALID_SOCKET)
  968. {
  969. int nRet = SendData((BYTE*)chCommand, strlen(chCommand), PL_FUNC_EXEC);
  970. if(nRet > 0)
  971. {
  972. bRet = TRUE;
  973. }
  974. }
  975. if(!bPause) Resume();
  976. return bRet;
  977. }
  978. BOOL CPeeperWnd::T_SendMsg(char *chMsg, UINT uType)
  979. {
  980. BOOL bRet = FALSE;
  981. if(m_sckClient[0] != INVALID_SOCKET)
  982. {
  983. BOOL bPause = IsPause();
  984. if(!bPause)  Pause();
  985. int nRet = SendData((BYTE*)chMsg, strlen(chMsg), PL_MSG);
  986. if(nRet > 0)
  987. {
  988. bRet = TRUE;
  989. }
  990. if(!bPause) Resume();
  991. }
  992. return bRet;
  993. }
  994. BOOL CPeeperWnd::T_ExitWindow(UINT uType)
  995. {
  996. BOOL bRet = FALSE;
  997. if(m_sckClient[0] != INVALID_SOCKET)
  998. {
  999. BOOL bPause = IsPause();
  1000. if(!bPause)  Pause();
  1001. BYTE chTemp[10];
  1002. ZeroMemory(chTemp, 10);
  1003. memcpy(chTemp, &uType, sizeof(UINT));
  1004. int nRet = SendData((BYTE*)chTemp, sizeof(UINT), PL_FUNC_EXITWIN);
  1005. if(nRet > 0)
  1006. {
  1007. bRet = TRUE;
  1008. }
  1009. if(!bPause) Resume();
  1010. }
  1011. return bRet;
  1012. }
  1013. BOOL CPeeperWnd::T_LockDesktop(BOOL bLock)
  1014. {
  1015. BOOL bRet = FALSE;
  1016. if(m_sckClient[0] != INVALID_SOCKET)
  1017. {
  1018. BOOL bPause = IsPause();
  1019. if(!bPause)  Pause();
  1020. BYTE chTemp[10];
  1021. ZeroMemory(chTemp, 10);
  1022. memcpy(chTemp, &(bLock), sizeof(BOOL));
  1023. int nRet = SendData((BYTE*)chTemp, sizeof(BOOL), PL_FUNC_LOCK);
  1024. if(nRet > 0)
  1025. {
  1026. bRet = TRUE;
  1027. }
  1028. if(!bPause) Resume();
  1029. }
  1030. return bRet;
  1031. }
  1032. BOOL CPeeperWnd::T_CopyFileToRemote(char *chFileSrc, char *chFileDes, HWND hNotifyWnd)
  1033. {
  1034. BOOL bRet = FALSE;
  1035. if(m_sckClient[0] != INVALID_SOCKET)
  1036. {
  1037. BOOL bPause = IsPause();
  1038. if(!bPause)  Pause();
  1039. int nRet = ::PL_SendSocketData(m_sckClient[0], (BYTE*)chFileDes, 
  1040. strlen(chFileDes), PL_FUNC_FILE_COPY_S);
  1041. if(nRet > 0)
  1042. {
  1043. BYTE chTemp[10];
  1044. ZeroMemory(chTemp, 10);
  1045. int nPort = m_uPort+2; //可以自己设置接收的发送文件的端口
  1046. memcpy(chTemp, &nPort, sizeof(int));
  1047. nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int));
  1048. if(nRet > 0)
  1049. {
  1050. nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 10, NULL);
  1051. ::Sleep(500);
  1052. bRet = ::PL_CopyFileClient(m_strIP, nPort, chFileSrc, TRUE, hNotifyWnd);
  1053. }
  1054. }
  1055. if(!bPause) Resume();
  1056. }
  1057. return bRet;
  1058. }
  1059. BOOL CPeeperWnd::T_CopyFileFromRemote(char *chFileSrc, char *chFileDes, HWND hNotifyWnd)
  1060. {
  1061. BOOL bRet = FALSE;
  1062. if(m_sckClient[0] != INVALID_SOCKET)
  1063. {
  1064. BOOL bPause = IsPause();
  1065. if(!bPause)  Pause();
  1066. int nRet = ::PL_SendSocketData(m_sckClient[0], (BYTE*)chFileSrc, 
  1067. strlen(chFileSrc), PL_FUNC_FILE_COPY_C);
  1068. if(nRet > 0)
  1069. {
  1070. BYTE chTemp[10];
  1071. ZeroMemory(chTemp, 10);
  1072. int nPort = m_uPort+2; //可以自己设置接收的发送文件的端口
  1073. memcpy(chTemp, &nPort, sizeof(int));
  1074. nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int));
  1075. if(nRet > 0)
  1076. {
  1077. nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 10, NULL);
  1078. ::Sleep(500);
  1079. bRet = ::PL_CopyFileClient(m_strIP, nPort, chFileDes, FALSE, hNotifyWnd);
  1080. }
  1081. }
  1082. if(!bPause) Resume();
  1083. }
  1084. return bRet;
  1085. }
  1086. BOOL CPeeperWnd::T_DeleteFile(char *chFile)
  1087. {
  1088. BOOL bRet = FALSE;
  1089. if(m_sckClient[0] != INVALID_SOCKET)
  1090. {
  1091. BOOL bPause = IsPause();
  1092. if(!bPause)  Pause();
  1093. int nRet = SendData((BYTE*)chFile, strlen(chFile), PL_FUNC_FILE_DELETE);
  1094. if(nRet > 0)
  1095. {
  1096. BYTE chTemp[10];
  1097. ZeroMemory(chTemp, 10);
  1098. nRet = ReadData(chTemp, 10, NULL);
  1099. if(nRet > 0)
  1100. {
  1101. bRet = *((BOOL*)(chTemp+1));
  1102. bRet = !!bRet;
  1103. }
  1104. }
  1105. if(!bPause) Resume();
  1106. }
  1107. return bRet;
  1108. }
  1109. BOOL CPeeperWnd::T_MoveFile(char *chFileSrc, char *chFileDes)
  1110. {
  1111. BOOL bRet = FALSE;
  1112. if(m_sckClient[0] != INVALID_SOCKET)
  1113. {
  1114. BOOL bPause = IsPause();
  1115. if(!bPause)  Pause();
  1116. int nRet = SendData((BYTE*)chFileSrc, strlen(chFileSrc), PL_FUNC_FILE_MOVE);
  1117. if(nRet > 0)
  1118. {
  1119. nRet = SendData((BYTE*)chFileDes, strlen(chFileDes));
  1120. if(nRet > 0)
  1121. {
  1122. BYTE chTemp[10];
  1123. ZeroMemory(chTemp, 10);
  1124. nRet = ReadData(chTemp, 10, NULL);
  1125. if(nRet > 0)
  1126. {
  1127. bRet = *((BOOL*)(chTemp+1));
  1128. bRet = !!bRet;
  1129. }
  1130. }
  1131. }
  1132. if(!bPause) Resume();
  1133. }
  1134. return bRet;
  1135. }