www.pudn.com > 大型远程控制软件(偷窥者)源码大公开.zip > PeeperWnd.cpp


/////////////////////////////////////////////////////////////////////////////// 
// 远程控制软件-偷窥者  开发库                                               // 
// 日期:2001/10/02                                                           // 
// 作者:刘东发                                                               // 
// Email:dongfa@yeah.net                                                     // 
// http://dongfa.yeah.net                                                    // 
// OICQ:5584173  阿东                                                        // 
// 作者声明:                                                                 // 
//     此部分代码全是作者所写,或以随便传播,但要保持文件的完整性,有问题     // 
// 或者意见请来信,谢谢!                                                      // 
/////////////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "PeeperWnd.h" 
 
#define USE_DOC // 如果不需要Doc类时,删除此行 
 
#ifdef USE_DOC 
#include "PeeperClientDoc.h" 
#endif 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
// CGetDIBThread 
IMPLEMENT_DYNCREATE(CPeeperThread, CWinThread) 
 
CPeeperThread::CPeeperThread() 
{ 
	m_pPeeperWnd = NULL; 
	m_bAutoDelete = FALSE; 
	m_szScreen.cx = 1024; 
	m_szScreen.cx = 768; 
} 
 
CPeeperThread::~CPeeperThread() 
{ 
} 
 
BEGIN_MESSAGE_MAP(CPeeperThread, CWinThread) 
	//{{AFX_MSG_MAP(CGetDIBThread) 
	//}}AFX_MSG_MAP 
	ON_THREAD_MESSAGE(PL_GET_DIB_MESSAGE, OnMsgGetDIB) 
	ON_THREAD_MESSAGE(PL_CONNECT_MESSAGE, OnMsgConnect) 
END_MESSAGE_MAP() 
 
HRESULT CPeeperThread::OnMsgConnect(WPARAM, LPARAM) 
{ 
	BOOL bRet = FALSE; 
	do 
	{ 
		bRet = ::PL_InitSocket(); 
		if(!bRet) 
		{ 
			break ; 
		} 
 
		if(!m_pPeeperWnd) 
		{ 
			bRet = FALSE; 
			break ; 
		} 
		int nRet = 0; 
		sockaddr_in addr; 
		hostent* pEnt = NULL; 
		 
		m_pPeeperWnd->m_sckClient[0] = ::socket(AF_INET, SOCK_STREAM, 0); 
		m_pPeeperWnd->m_sckClient[1] = ::socket(AF_INET, SOCK_STREAM, 0); 
		TRACE(_T("Client Socket 0 and 1:%d, %d.\n"),  
			m_pPeeperWnd->m_sckClient[0], m_pPeeperWnd->m_sckClient[1]); 
		if(m_pPeeperWnd->m_sckClient[0] == INVALID_SOCKET || 
			m_pPeeperWnd->m_sckClient[1] == INVALID_SOCKET) 
		{ 
			bRet = FALSE; 
			break ; 
		} 
 
		pEnt = ::gethostbyname(m_pPeeperWnd->m_strIP); 
		if(!pEnt) 
		{ 
			bRet = FALSE; 
			break ; 
		} 
		addr.sin_family = AF_INET; 
		addr.sin_port = ::htons((u_short)(m_pPeeperWnd->m_uPort)); 
		addr.sin_addr.S_un.S_un_b.s_b1 = pEnt->h_addr_list[0][0]; 
		addr.sin_addr.S_un.S_un_b.s_b2 = pEnt->h_addr_list[0][1]; 
		addr.sin_addr.S_un.S_un_b.s_b3 = pEnt->h_addr_list[0][2]; 
		addr.sin_addr.S_un.S_un_b.s_b4 = pEnt->h_addr_list[0][3]; 
			 
		bRet = FALSE; // default 
		for(int i = 0; i < 3; i ++) 
		{ 
			int nRet1 = ::connect(m_pPeeperWnd->m_sckClient[0],  
				(sockaddr*)&addr, sizeof(addr)); 
			if(nRet1 != SOCKET_ERROR) 
			{ 
				BYTE chData[5]; 
				ZeroMemory(chData, 5); 
				::PL_ReadSocketData(m_pPeeperWnd->m_sckClient[0], chData, 5, NULL); 
			} 
			else 
			{ 
				TRACE(_T("Socket Error Code = %d.\n"), ::WSAGetLastError()); 
			} 
			TRACE(_T("Client[0] is: %s.\n"), (nRet1 == 0)?_T("Ok"):_T("Failed.")); 
			int nRet2 = ::connect(m_pPeeperWnd->m_sckClient[1],  
				(sockaddr*)&addr, sizeof(addr)); 
			if(nRet2 == SOCKET_ERROR) 
			{ 
				TRACE(_T("Socket Error Code = %d.\n"), ::WSAGetLastError()); 
			} 
 
			TRACE(_T("Client[1] is: %s.\n"), (nRet2 == 0)?_T("Ok"):_T("Failed.")); 
			if(nRet1 == SOCKET_ERROR || 
				nRet2 == SOCKET_ERROR) 
			{ 
				Sleep(2000); 
				continue ; 
			} 
 
			char chConnectInfo[512]; 
			ZeroMemory(chConnectInfo, 512); 
			int nRet = ::PL_ReadSocketData(m_pPeeperWnd->m_sckClient[0],  
				(BYTE *)chConnectInfo, 512, NULL); 
			m_pPeeperWnd->SetConnectInfo(chConnectInfo); 
 
			bRet = TRUE; // Connect Ok! 
			break ; 
		} 
	}while(0); 
 
	if(m_pPeeperWnd) 
	{ 
		DWORD dwFlag = PL_PEEPER_NOTIFY_DISCONNECT; 
		if(bRet) 
		{ 
			dwFlag = PL_PEEPER_NOTIFY_CONNECT; 
		} 
		::SendMessage(m_pPeeperWnd->GetSafeHwnd(),  
			PL_CONNECT_MESSAGE, (WPARAM)PL_CONNECT_MESSAGE, (LPARAM)dwFlag); 
	} 
 
	return bRet ? S_OK : E_FAIL; 
} 
HRESULT CPeeperThread::OnMsgGetDIB(WPARAM, LPARAM) 
{ 
	int nRet = INVALID_SOCKET; 
	DWORD d1 = ::GetTickCount(); 
	if(m_pPeeperWnd && (m_pPeeperWnd->m_sckClient[1] != INVALID_SOCKET)) 
	{ 
		BYTE chData[20]; 
		ZeroMemory(chData, 20); 
 
		//发送颜色位数和压缩类型 
		PL_ColorType ctColor = m_pPeeperWnd->GetColorType(); 
		memcpy(chData, &ctColor, sizeof(PL_ColorType)); 
		PL_ZipType ztZip = m_pPeeperWnd->GetZipType(); 
		memcpy(chData+sizeof(PL_ColorType), &ztZip, sizeof(PL_ZipType)); 
 
		nRet = ::PL_SendSocketData(m_pPeeperWnd->m_sckClient[1],  
			chData, sizeof(PL_ColorType) + sizeof(PL_ZipType)); 
 
		//读取图像大小 
		ZeroMemory(chData, 20); 
		nRet = ::PL_ReadSocketData(m_pPeeperWnd->m_sckClient[1], chData, 20, NULL); 
		if(nRet > 0) 
		{ 
			int nSize = *((int*)(chData+1)); 
			int cx = *((int*)(chData+1+sizeof(int))); 
			int cy = *((int*)(chData+1+sizeof(int)*2)); 
			m_szScreen.cx = cx; 
			m_szScreen.cy = cy; 
			if(m_pPeeperWnd->m_hDib) 
			{ 
				::GlobalFree(m_pPeeperWnd->m_hDib); 
			} 
			m_pPeeperWnd->m_hDib = (HDIB)::GlobalAlloc(GPTR, nSize); 
			LPBYTE lpData = (LPBYTE)::GlobalLock(m_pPeeperWnd->m_hDib); 
			int nRead = 0; 
			while(nRead < nSize) 
			{ 
				int nBytes = ::PL_ReadSocketData(m_pPeeperWnd->m_sckClient[1],  
					(BYTE *)(lpData+nRead), PL_SOCKET_MAXBYTES, NULL); 
				nRead += (nBytes); 
			} 
			::GlobalUnlock(m_pPeeperWnd->m_hDib); 
			if(nRead == (int)::GlobalSize(m_pPeeperWnd->m_hDib)) 
			{ 
				::PostMessage(m_pPeeperWnd->GetSafeHwnd(),  
					PL_GET_DIB_MESSAGE, (WPARAM)PL_GET_DIB_MESSAGE, (LPARAM)ztZip); 
			} 
		} 
	} 
	TRACE(_T("Get data times:%d(ms).\nGet data sizes:%d(bytes).\n"), 
		::GetTickCount() - d1, ::GlobalSize(m_pPeeperWnd->m_hDib)); 
	return nRet; 
} 
 
IMPLEMENT_DYNCREATE(CPeeperWnd, CScrollView) 
 
CPeeperWnd::CPeeperWnd(CWnd *pNotifyWnd) 
{ 
	m_pNotifyWnd = pNotifyWnd; 
	m_strIP = _T("127.0.0.1"); 
	m_uPort = 0; 
	m_hDib = NULL; 
	m_nBits = 4; 
	m_szScreen.cx = 1024; 
	m_szScreen.cy = 768; 
	m_nTimerID = PL_DIB_TIMERID; 
	m_nSpeed = PL_DIB_TIMER; 
	m_sckClient[0] = INVALID_SOCKET; 
	m_sckClient[1] = INVALID_SOCKET; 
	m_bIsDoing = FALSE; 
	ZeroMemory(m_chConnectInfo, 512); 
	strcpy(m_chConnectInfo, "Not Connected."); 
	m_nRetryTime = ::GetTickCount(); 
	m_nLastUpdateTime = ::GetTickCount(); 
	m_bIsPause = FALSE; 
	m_dwEnableFlag = PL_ENABLE_ALL; 
 
	m_ctColor = color_4; 
	m_ztZip = zip_none; 
	m_strState = _T("开始连接..."); 
	m_nConnectTime = 0; 
 
	m_bIsConnect = FALSE; 
} 
 
CPeeperWnd::~CPeeperWnd() 
{ 
	ExitConnect();	 
	::PL_TermSocket(); 
} 
 
 
BEGIN_MESSAGE_MAP(CPeeperWnd, CScrollView) 
	//{{AFX_MSG_MAP(CPeeperWnd) 
	ON_WM_CREATE() 
	ON_WM_LBUTTONDBLCLK() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	ON_WM_RBUTTONDBLCLK() 
	ON_WM_RBUTTONDOWN() 
	ON_WM_RBUTTONUP() 
	ON_WM_MOUSEMOVE() 
	ON_WM_TIMER() 
	ON_WM_DESTROY() 
	ON_WM_KEYDOWN() 
	ON_WM_KEYUP() 
	ON_WM_SYSKEYDOWN() 
	ON_WM_SYSKEYUP() 
	//}}AFX_MSG_MAP 
	ON_MESSAGE(PL_GET_DIB_MESSAGE, OnMsgPeeperThread) 
	ON_MESSAGE(PL_CONNECT_MESSAGE, OnMsgPeeperThread) 
END_MESSAGE_MAP() 
 
//返回偷窥者客户端的版本 
CString CPeeperWnd::GetClientVersion() 
{ 
	return PEEPER_SERVER_VER_15; 
} 
 
BOOL CPeeperWnd::Create(CString strIP, UINT uPort, CWnd * pParent, int nBits, UINT nTimer) 
{ 
	m_strIP = strIP; 
	m_uPort = uPort; 
	m_nBits = nBits; 
	m_nSpeed = nTimer; 
 
	LPCTSTR lpszPeeperClass = AfxRegisterWndClass(0); 
 
	BOOL bRet =  CWnd::CreateEx(0, lpszPeeperClass, NULL,  
		WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,  
		CRect(100, 100, 200, 150), pParent, NULL); 
 
	return bRet; 
} 
 
void CPeeperWnd::SetNotifyWnd(CWnd *pNotifyWnd) 
{ 
	m_pNotifyWnd = pNotifyWnd; 
} 
 
void CPeeperWnd::SetBits(int nBits) 
{ 
	m_nBits = nBits; 
	SendDIBBits(); 
} 
 
void CPeeperWnd::SetUpdateSpeed(UINT nTimer) 
{ 
	m_nSpeed = nTimer; 
	KillTimer(m_nTimerID); 
	SetTimer(m_nTimerID, m_nSpeed, NULL); 
} 
 
int CPeeperWnd::SendData(BYTE *chData, int nLen, BYTE chFlag) 
{ 
	int nRet = INVALID_SOCKET; 
	if(m_sckClient[0] != INVALID_SOCKET) 
	{ 
		nRet = ::PL_SendSocketData(m_sckClient[0], chData, nLen, chFlag); 
	} 
	return nRet; 
} 
 
int CPeeperWnd::ReadData(BYTE *chData, int nLen, BYTE *chFlag) 
{ 
	int nRet = INVALID_SOCKET; 
	if(m_sckClient[0] != INVALID_SOCKET) 
	{ 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chData, nLen, chFlag); 
	} 
	return nRet; 
} 
 
BOOL CPeeperWnd::CanSend() 
{ 
	return (m_sckClient[0] != INVALID_SOCKET) && (!m_bIsPause); 
} 
 
void CPeeperWnd::Pause() 
{ 
	m_bIsPause = TRUE; 
} 
 
BOOL CPeeperWnd::IsPause() 
{ 
	return m_bIsPause; 
} 
 
void CPeeperWnd::Resume() 
{ 
	m_bIsPause = FALSE; 
} 
 
DWORD CPeeperWnd::SetEnableFlag(DWORD dwFlag) 
{ 
	DWORD dwRet = m_dwEnableFlag; 
	m_dwEnableFlag = dwFlag; 
 
	return dwRet; 
} 
 
DWORD CPeeperWnd::SetEnableFlag(DWORD dwFlag, BOOL bSet) 
{ 
	DWORD dwRet = m_dwEnableFlag; 
	m_dwEnableFlag |= dwFlag; 
	if(!bSet) 
	{ 
		m_dwEnableFlag ^= dwFlag; 
	} 
	return dwRet; 
} 
 
DWORD CPeeperWnd::GetEnableFlag() 
{ 
	return m_dwEnableFlag; 
} 
 
BOOL CPeeperWnd::GetEnableFlag(DWORD dwEvent) 
{ 
	return ((GetEnableFlag() & dwEvent) == dwEvent); 
} 
 
POINT CPeeperWnd::GetMousePoint(BYTE *chData) 
{ 
	POINT pt1, pt2, point; 
	::GetCursorPos(&pt1); 
 
	pt2 = GetOffsetPos(); 
	pt1.x = pt1.x + pt2.x; 
	pt1.y = pt1.y + pt2.y; 
 
	CDC *pDC = GetDC(); 
	GetDCOrgEx(pDC->GetSafeHdc(), &pt2); 
	point.x = pt1.x - pt2.x; 
	point.y = pt1.y - pt2.y; 
 
	if(AfxIsValidAddress(chData, 12)) 
	{ 
		int cx = point.x; 
		int cy = point.y; 
		ZeroMemory(chData, 12); 
		memcpy(chData, &cx, sizeof(int)); 
		memcpy(chData+sizeof(int), &cy, sizeof(int)); 
	} 
	return point; 
} 
 
CPoint CPeeperWnd::GetOffsetPos(BOOL bScroll) 
{ 
	CPoint pt = GetScrollPosition(); 
	CPoint point = CPoint(0, 0); 
	CRect rect; 
	GetClientRect(&rect); 
	if(rect.Width() > m_szScreen.cx) 
	{ 
		point.x = ((rect.Width() - m_szScreen.cx)/2); 
	} 
	if(rect.Height() > m_szScreen.cy) 
	{ 
		point.y = ((rect.Height() - m_szScreen.cy)/2); 
	} 
	if(bScroll) 
	{ 
		pt.x -= point.x; 
		pt.y -= point.y; 
	} 
	else 
	{ 
		pt = point; 
	} 
	return pt; 
} 
 
int CPeeperWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CScrollView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	m_hPeeperThread.m_pPeeperWnd = this; 
	m_hPeeperThread.CreateThread(); 
 
	ModifyStyleEx(WS_EX_CLIENTEDGE, 0); 
 
	return 0; 
} 
 
void CPeeperWnd::OnInitialUpdate() 
{ 
	CScrollView::OnInitialUpdate(); 
	SetScrollSizes(MM_TEXT, CSize(0, 0)); 
 
#ifdef USE_DOC 
	if(m_pDocument) 
	{ 
		m_strIP = ((CPeeperClientDoc *)m_pDocument)->m_strIP; 
		m_uPort = ((CPeeperClientDoc *)m_pDocument)->m_uPort; 
		m_nBits = ((CPeeperClientDoc *)m_pDocument)->m_nBits; 
		m_nSpeed = ((CPeeperClientDoc *)m_pDocument)->m_nSpeed; 
		CString str; 
		str.Format(_T("偷窥者窗口--[IP/Name:%s  Port:%d]"), m_strIP, m_uPort); 
		m_pDocument->SetTitle(str); 
	} 
#else 
	//不使用Doc类时,可以在这里增加参数的设置 
#endif 
 
	if(!m_strIP.IsEmpty()) 
	{ 
		ConnectServer(); 
	} 
} 
 
void CPeeperWnd::OnDraw(CDC* pDC) 
{ 
	CRect rect; 
	GetClientRect(&rect); 
	if((m_memDC.m_hDC == NULL) ||  
		(rect.right > m_szScreen.cx || rect.bottom > m_szScreen.cy)) 
	{ 
		rect.right = max(rect.right, m_szScreen.cx); 
		rect.bottom = max(rect.bottom, m_szScreen.cy); 
		pDC->FillSolidRect(rect, RGB(0, 100, 150)); 
	} 
	if(m_memDC.m_hDC != NULL) 
	{ 
		CPoint pt = GetOffsetPos(FALSE); 
		pDC->BitBlt(pt.x, pt.y, m_szScreen.cx, m_szScreen.cy, &m_memDC, 0, 0, SRCCOPY); 
	} 
	else 
	{ 
		CFont font; 
		font.CreatePointFont(120, _T("宋体")); 
		CFont *old = pDC->SelectObject(&font); 
		CRect rc; 
		GetClientRect(&rc); 
		pDC->SetTextColor(RGB(255, 255, 255)); 
		pDC->DrawText(m_strState, rc, DT_SINGLELINE | DT_VCENTER | DT_CENTER); 
		pDC->SelectObject(old); 
	} 
} 
 
void CPeeperWnd::DrawDIB() 
{ 
	if(m_hDib && ::IsWindow(m_hWnd)) 
	{ 
		CClientDC dc(this); 
		if(m_hPeeperThread.m_szScreen.cx != m_szScreen.cx || 
			m_hPeeperThread.m_szScreen.cy != m_szScreen.cy) 
		{ 
			m_szScreen.cx = m_hPeeperThread.m_szScreen.cx; 
			m_szScreen.cy = m_hPeeperThread.m_szScreen.cy; 
			if(m_memDC.m_hDC) 
			{ 
				m_memDC.DeleteDC(); 
			} 
			m_memDC.CreateCompatibleDC(NULL); 
			CBitmap bmp; 
			bmp.CreateCompatibleBitmap(&dc, m_szScreen.cx, m_szScreen.cy); 
			m_memDC.SelectObject(&bmp); 
			SetScrollSizes(MM_TEXT, CSize(m_szScreen.cx, m_szScreen.cy)); 
			Invalidate(); 
			UpdateWindow(); 
		} 
		else 
		{ 
			if(!m_memDC.m_hDC) 
			{ 
				m_memDC.CreateCompatibleDC(NULL); 
				CBitmap bmp; 
				CClientDC dc(this); 
				bmp.CreateCompatibleBitmap(&dc, m_szScreen.cx, m_szScreen.cy); 
				m_memDC.SelectObject(&bmp); 
				SetScrollSizes(MM_TEXT, CSize(m_szScreen.cx, m_szScreen.cy)); 
			} 
		} 
		::PL_DrawDIB(m_memDC.m_hDC, NULL, m_hDib, NULL, NULL); 
		m_memDC.Draw3dRect(CRect(0, 0, m_szScreen.cx, m_szScreen.cy),  
			RGB(255, 255, 255), RGB(80, 80, 80)); 
 
#ifdef USE_DOC 
		//设置文件标题 
		CString str; 
		str.Format(_T("偷窥者窗口--[IP/Name:%s  Port:%d,  Refresh Time:%.3f(S/T)]"), 
			m_strIP, m_uPort, ((float)(::GetTickCount() - m_nLastUpdateTime))/1000.0f); 
		if(m_pDocument) 
		{ 
			m_pDocument->SetTitle(str); 
		} 
#endif  
		CPoint pt = GetOffsetPos(); 
		dc.BitBlt(-pt.x, -pt.y, m_szScreen.cx, m_szScreen.cy, &m_memDC, 0, 0, SRCCOPY); 
		m_strState = _T("连接完毕"); 
	} 
	m_bIsDoing = FALSE; 
	m_nLastUpdateTime = ::GetTickCount(); 
} 
 
BOOL CPeeperWnd::PreTranslateMessage(MSG* pMsg)  
{ 
	return CScrollView::PreTranslateMessage(pMsg); 
} 
 
void CPeeperWnd::OnLButtonDblClk(UINT nFlags, CPoint point)  
{ 
	if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_LDBLCLK)) 
	{ 
		BYTE chData[20]; 
		GetMousePoint(chData); 
		BOOL bMouseMove = GetEnableFlag(PL_ENABLE_MOUSE_MOVE); 
		bMouseMove = !bMouseMove; 
		memcpy(chData+sizeof(int)*2, &bMouseMove, sizeof(BOOL)); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], chData,  
			sizeof(int)*2+sizeof(BOOL), PL_MOUSE_LDBLCLK); 
		if(nRet <= 0) 
		{ 
			ExitConnect(); 
			return ; 
		} 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL); 
		return ; 
	} 
	CScrollView::OnLButtonDblClk(nFlags, point); 
} 
 
void CPeeperWnd::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_LBUTTON)) 
	{ 
		BYTE chData[20]; 
		GetMousePoint(chData); 
		BOOL bMouseMove = GetEnableFlag(PL_ENABLE_MOUSE_MOVE); 
		bMouseMove = !bMouseMove; 
		memcpy(chData+sizeof(int)*2, &bMouseMove, sizeof(BOOL)); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], chData,  
			sizeof(int)*2+sizeof(BOOL), PL_MOUSE_LBUTTONDOWN); 
		if(nRet <= 0) 
		{ 
			ExitConnect(); 
			return ; 
		} 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL); 
		return ; 
	} 
	CScrollView::OnLButtonDown(nFlags, point); 
} 
 
void CPeeperWnd::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_LBUTTON)) 
	{ 
		BYTE chData[20]; 
		GetMousePoint(chData); 
		BOOL bMouseMove = GetEnableFlag(PL_ENABLE_MOUSE_MOVE); 
		bMouseMove = !bMouseMove; 
		memcpy(chData+sizeof(int)*2, &bMouseMove, sizeof(BOOL)); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], chData,  
			sizeof(int)*2+sizeof(BOOL), PL_MOUSE_LBUTTONUP); 
		if(nRet <= 0) 
		{ 
			ExitConnect(); 
			return ; 
		} 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL); 
		return ; 
	} 
	CScrollView::OnLButtonUp(nFlags, point); 
} 
 
void CPeeperWnd::OnRButtonDblClk(UINT nFlags, CPoint point)  
{ 
	if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_RDBLCLK)) 
	{ 
		BYTE chData[20]; 
		GetMousePoint(chData); 
		BOOL bMouseMove = GetEnableFlag(PL_ENABLE_MOUSE_MOVE); 
		bMouseMove = !bMouseMove; 
		memcpy(chData+sizeof(int)*2, &bMouseMove, sizeof(BOOL)); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], chData,  
			sizeof(int)*2+sizeof(BOOL), PL_MOUSE_RDBLCLK); 
		if(nRet <= 0) 
		{ 
			ExitConnect(); 
			return ; 
		} 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL); 
		return ; 
	} 
	CScrollView::OnRButtonDblClk(nFlags, point); 
} 
 
void CPeeperWnd::OnRButtonDown(UINT nFlags, CPoint point)  
{ 
	if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_RBUTTON)) 
	{ 
		BYTE chData[20]; 
		GetMousePoint(chData); 
		BOOL bMouseMove = GetEnableFlag(PL_ENABLE_MOUSE_MOVE); 
		bMouseMove = !bMouseMove; 
		memcpy(chData+sizeof(int)*2, &bMouseMove, sizeof(BOOL)); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], chData,  
			sizeof(int)*2+sizeof(BOOL), PL_MOUSE_RBUTTONDOWN); 
		if(nRet <= 0) 
		{ 
			ExitConnect(); 
			return ; 
		} 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL); 
		return ; 
	} 
	CScrollView::OnRButtonDown(nFlags, point); 
} 
 
void CPeeperWnd::OnRButtonUp(UINT nFlags, CPoint point)  
{ 
	if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_RBUTTON)) 
	{ 
		BYTE chData[20]; 
		GetMousePoint(chData); 
		BOOL bMouseMove = GetEnableFlag(PL_ENABLE_MOUSE_MOVE); 
		bMouseMove = !bMouseMove; 
		memcpy(chData+sizeof(int)*2, &bMouseMove, sizeof(BOOL)); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], chData,  
			sizeof(int)*2+sizeof(BOOL), PL_MOUSE_RBUTTONUP); 
		if(nRet <= 0) 
		{ 
			ExitConnect(); 
			return ; 
		} 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL); 
		return ; 
	} 
	CScrollView::OnRButtonUp(nFlags, point); 
} 
 
void CPeeperWnd::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	if(CanSend() && GetEnableFlag(PL_ENABLE_MOUSE_MOVE)) 
	{ 
		BYTE chData[20]; 
		GetMousePoint(chData); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], chData,  
			sizeof(int)*2, PL_MOUSE_MOVE); 
		if(nRet <= 0) 
		{ 
			ExitConnect(); 
			return ; 
		} 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chData, 2, NULL); 
		return ; 
	} 
	CScrollView::OnMouseMove(nFlags, point); 
} 
 
void CPeeperWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	if(CanSend() && (((BYTE)nChar != VK_LWIN && (BYTE)nChar != VK_RWIN)) && 
		GetEnableFlag(PL_ENABLE_KEY)) 
	{ 
		BYTE chTemp[15]; 
		ZeroMemory(chTemp, 15); 
		memcpy(chTemp, &nChar, sizeof(UINT)); 
		memcpy(chTemp+sizeof(UINT), &nFlags, sizeof(UINT)); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)*2, PL_KEY_DOWN); 
		if(nRet <= 0) 
		{ 
			ExitConnect(); 
			return ; 
		} 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 2, NULL); 
		return ; 
	}								   
	CScrollView::OnKeyDown(nChar, nRepCnt, nFlags); 
} 
 
void CPeeperWnd::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	if(CanSend() && (((BYTE)nChar != VK_LWIN && (BYTE)nChar != VK_RWIN)) && 
		GetEnableFlag(PL_ENABLE_KEY)) 
	{ 
		BYTE chTemp[15]; 
		ZeroMemory(chTemp, 15); 
		memcpy(chTemp, &nChar, sizeof(UINT)); 
		memcpy(chTemp+sizeof(UINT), &nFlags, sizeof(UINT)); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)*2, PL_KEY_UP); 
		if(nRet <= 0) 
		{ 
			ExitConnect(); 
			return ; 
		} 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 2, NULL); 
		return ; 
	} 
	CScrollView::OnKeyUp(nChar, nRepCnt, nFlags); 
} 
 
void CPeeperWnd::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	if(CanSend() && (((BYTE)nChar != VK_LWIN && (BYTE)nChar != VK_RWIN)) && 
		GetEnableFlag(PL_ENABLE_KEY)) 
	{ 
		BYTE chTemp[15]; 
		ZeroMemory(chTemp, 15); 
		memcpy(chTemp, &nChar, sizeof(UINT)); 
		memcpy(chTemp+sizeof(UINT), &nFlags, sizeof(UINT)); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)*2, PL_KEY_DOWN); 
		if(nRet <= 0) 
		{ 
			ExitConnect(); 
			return ; 
		} 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 2, NULL); 
		return ; 
	} 
	CScrollView::OnSysKeyDown(nChar, nRepCnt, nFlags); 
} 
 
void CPeeperWnd::OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	if(CanSend() && (((BYTE)nChar != VK_LWIN && (BYTE)nChar != VK_RWIN)) && 
		GetEnableFlag(PL_ENABLE_KEY)) 
	{ 
		BYTE chTemp[15]; 
		ZeroMemory(chTemp, 15); 
		memcpy(chTemp, &nChar, sizeof(UINT)); 
		memcpy(chTemp+sizeof(UINT), &nFlags, sizeof(UINT)); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)*2, PL_KEY_UP); 
		if(nRet <= 0) 
		{ 
			ExitConnect(); 
			return ; 
		} 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 2, NULL); 
		return ; 
	} 
	CScrollView::OnSysKeyUp(nChar, nRepCnt, nFlags); 
} 
 
void CPeeperWnd::OnTimer(UINT nIDEvent)  
{ 
	if(nIDEvent == m_nTimerID) 
	{ 
		if(m_sckClient[0] == INVALID_SOCKET || 
		   m_sckClient[1] == INVALID_SOCKET) 
		{ 
			if((::GetTickCount() - m_nRetryTime) > (int)(PL_SOCKET_RETRYTIME)) 
			{ 
				ConnectServer(); 
				m_nRetryTime = ::GetTickCount(); 
			} 
		} 
		if(!m_bIsDoing && CanSend() && GetEnableFlag(PL_ENABLE_DIB)) 
		{ 
			m_bIsDoing = TRUE; 
			::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_DIB); 
			m_hPeeperThread.PostThreadMessage(PL_GET_DIB_MESSAGE, 0, 0); 
		} 
	} 
	CScrollView::OnTimer(nIDEvent); 
} 
 
char *CPeeperWnd::GetConnectInfo() 
{ 
	return m_chConnectInfo; 
} 
 
void CPeeperWnd::SetConnectInfo(char *chInfo) 
{ 
	strncpy(m_chConnectInfo, chInfo, 510); 
} 
 
BOOL CPeeperWnd::CloseServer() 
{ 
	BOOL bRet = FALSE; 
	if(GetState()) 
	{ 
		int nRet = SendData(NULL, 0, PL_CLOSE_PEEPER); 
		bRet = nRet > 0; 
		ExitConnect(); 
	} 
	return FALSE; 
} 
 
BOOL CPeeperWnd::ConnectServer() 
{ 
	BOOL bRet = FALSE; 
	if(m_hPeeperThread.m_hThread != NULL) 
	{ 
		m_hPeeperThread.PostThreadMessage(PL_CONNECT_MESSAGE, 0, 0); 
		bRet = TRUE; 
	} 
	return bRet; 
} 
 
BOOL CPeeperWnd::GetState() 
{ 
	if((!m_bIsConnect) ||  
		(m_sckClient[0] == INVALID_SOCKET ||  
		m_sckClient[1] == INVALID_SOCKET)) 
	{ 
		return FALSE; 
	} 
	return TRUE; 
} 
 
CString CPeeperWnd::GetClientInfo() 
{ 
	return m_strState; 
} 
 
UINT CPeeperWnd::GetConnectTime() 
{ 
	return GetState()?((GetTickCount() - m_nConnectTime)/1000) : 0; 
} 
 
BOOL CPeeperWnd::ExitConnect() 
{ 
	if(m_sckClient[0] != INVALID_SOCKET) 
	{ 
		::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_CLIENT_CLOSE); 
		::closesocket(m_sckClient[0]); 
	} 
	if(m_sckClient[1] != INVALID_SOCKET) 
	{ 
		::closesocket(m_sckClient[1]); 
	} 
	m_sckClient[0] = INVALID_SOCKET; 
	m_sckClient[1] = INVALID_SOCKET; 
 
	if(m_pNotifyWnd) 
	{ 
		::PostMessage(m_pNotifyWnd->GetSafeHwnd(), PL_PEEPER_NOTIFY,  
			(WPARAM)PL_PEEPER_NOTIFY_DISCONNECT, (LPARAM)this); 
	} 
 
	return TRUE; 
} 
 
int CPeeperWnd::GetScreenSize() 
{ 
	int nRet = ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_SCREEN_SIZE); 
	if(nRet > 0) 
	{ 
		BYTE chTemp[20]; 
		ZeroMemory(chTemp, 20); 
		nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 20, 0); 
		if(nRet > 0) 
		{ 
			m_szScreen.cx = *((int*)(chTemp)); 
			m_szScreen.cy = *((int*)(chTemp+sizeof(int))); 
		} 
	} 
	if(nRet <= 0) 
	{ 
		ExitConnect(); 
	} 
 
	return nRet; 
} 
 
int CPeeperWnd::SendDIBBits() 
{ 
	int nRet = INVALID_SOCKET; 
	if(CanSend()) 
	{ 
		nRet = ::PL_SendSocketData(m_sckClient[0], (BYTE *)&m_nBits, sizeof(int), PL_DIB_BITS); 
		if(nRet <= 0) 
		{ 
			ExitConnect(); 
		} 
	} 
	return nRet; 
} 
 
HRESULT CPeeperWnd::OnMsgPeeperThread(WPARAM wParam, LPARAM lParam) 
{ 
	DWORD dwMessage = (DWORD)wParam; 
	BYTE chFlag = (BYTE)lParam; 
	DWORD dwFlag = (DWORD)lParam; 
	switch(dwMessage) 
	{ 
	case PL_GET_DIB_MESSAGE: 
		{ 
			switch((PL_ZipType)dwFlag) 
			{ 
			case zip_none: 
				{ 
					;//not to do 
				} 
				break ; 
			case zip_lz77: 
				{ 
					HDIB hDib = (HDIB)::PL_LZ77_UnZip(m_hDib); 
					::GlobalFree(m_hDib); 
					m_hDib = hDib; 
				} 
				break ; 
			case zip_lzw: 
				{ 
					HDIB hDib = (HDIB)::PL_LZW_UnZip(m_hDib); 
					::GlobalFree(m_hDib); 
					m_hDib = hDib; 
				} 
				break ; 
			case zip_jpeg: 
				{ 
				} 
				break;  
			case zip_lzss: 
				{ 
					HDIB hDib = (HDIB)::PL_LZSS_UnZip(m_hDib); 
					::GlobalFree(m_hDib); 
					m_hDib = hDib; 
				} 
				break ; 
			case zip_ari: 
				{ 
					HDIB hDib = (HDIB)::PL_ARI_UnZip(m_hDib); 
					::GlobalFree(m_hDib); 
					m_hDib = hDib; 
				} 
				break ; 
			default : 
				{ 
					return S_OK; 
				} 
			} 
			DrawDIB(); 
 
			return S_OK; 
		} 
		break ; 
	case PL_CONNECT_MESSAGE: 
		{ 
			switch(dwFlag) 
			{ 
			case PL_PEEPER_NOTIFY_CONNECT: 
				{ 
					m_nConnectTime = ::GetTickCount(); 
					m_strState = _T("成功连接,开始接收桌面图像..."); 
					Invalidate(); 
					UpdateWindow(); 
					TRACE(m_chConnectInfo); 
					TRACE(_T("\n")); 
					m_bIsDoing = FALSE; 
					KillTimer(m_nTimerID); 
					SetTimer(m_nTimerID, m_nSpeed, NULL); 
					if(m_pNotifyWnd) 
					{ 
						::PostMessage(m_pNotifyWnd->GetSafeHwnd(), PL_PEEPER_NOTIFY,  
							(WPARAM)PL_PEEPER_NOTIFY_CONNECT, (LPARAM)this); 
					} 
					m_bIsConnect = TRUE; 
				} 
				break ; 
			case PL_PEEPER_NOTIFY_DISCONNECT: 
				{ 
					m_bIsConnect = FALSE; 
					m_strState = _T("连接失败,开始重试..."); 
					if(m_memDC.m_hDC == NULL) 
					{ 
						Invalidate(); 
						UpdateWindow(); 
					} 
					ExitConnect(); 
					m_nConnectTime = ::GetTickCount(); 
					KillTimer(m_nTimerID); 
					SetTimer(m_nTimerID, m_nSpeed, NULL); 
				} 
				break ; 
			default : 
				{ 
					ExitConnect(); 
				} 
				break ; 
			} 
			return S_OK; 
		} 
		break ; 
	} 
	return S_OK; 
} 
 
void CPeeperWnd::OnDestroy()  
{ 
	ExitConnect(); 
	if(::IsWindow(m_hWnd)) 
	{ 
		KillTimer(m_nTimerID); 
	} 
	if(m_hPeeperThread.m_hThread != NULL) 
	{ 
		::TerminateThread(m_hPeeperThread.m_hThread, 0xDB); 
		::WaitForSingleObject(m_hPeeperThread.m_hThread, INFINITE); 
		m_hPeeperThread.m_hThread = NULL; 
		TRACE(_T("Peeper Thread Exit.\n")); 
	} 
	if(m_pNotifyWnd) 
	{ 
		::PostMessage(m_pNotifyWnd->GetSafeHwnd(), PL_PEEPER_NOTIFY,  
			(WPARAM)PL_PEEPER_NOTIFY_CLOSE, (LPARAM)this); 
	} 
	CScrollView::OnDestroy(); 
} 
 
// tools function 
BOOL CPeeperWnd::T_RunCommand(char *chCommand) 
{ 
	BOOL bRet = FALSE; 
	BOOL bPause = IsPause(); 
	 
	if(!bPause)  Pause(); 
 
	if(m_sckClient[0] != INVALID_SOCKET) 
	{ 
		int nRet = SendData((BYTE*)chCommand, strlen(chCommand), PL_FUNC_EXEC); 
		if(nRet > 0) 
		{ 
			bRet = TRUE; 
		} 
	} 
	if(!bPause) Resume(); 
 
	return bRet; 
} 
 
BOOL CPeeperWnd::T_SendMsg(char *chMsg, UINT uType) 
{ 
	BOOL bRet = FALSE; 
	if(m_sckClient[0] != INVALID_SOCKET) 
	{ 
		BOOL bPause = IsPause(); 
		if(!bPause)  Pause(); 
		 
		int nRet = SendData((BYTE*)chMsg, strlen(chMsg), PL_MSG); 
		if(nRet > 0) 
		{ 
			bRet = TRUE; 
		} 
		if(!bPause) Resume(); 
	} 
	 
	return bRet; 
} 
 
BOOL CPeeperWnd::T_ExitWindow(UINT uType) 
{ 
	BOOL bRet = FALSE; 
	if(m_sckClient[0] != INVALID_SOCKET) 
	{ 
		BOOL bPause = IsPause(); 
		if(!bPause)  Pause(); 
		 
		BYTE chTemp[10]; 
		ZeroMemory(chTemp, 10); 
		memcpy(chTemp, &uType, sizeof(UINT)); 
		int nRet = SendData((BYTE*)chTemp, sizeof(UINT), PL_FUNC_EXITWIN); 
		if(nRet > 0) 
		{ 
			bRet = TRUE; 
		} 
		if(!bPause) Resume(); 
	} 
	return bRet; 
} 
 
BOOL CPeeperWnd::T_LockDesktop(BOOL bLock) 
{ 
	BOOL bRet = FALSE; 
	if(m_sckClient[0] != INVALID_SOCKET) 
	{ 
		BOOL bPause = IsPause(); 
		if(!bPause)  Pause(); 
		 
		BYTE chTemp[10]; 
		ZeroMemory(chTemp, 10); 
		memcpy(chTemp, &(bLock), sizeof(BOOL)); 
		int nRet = SendData((BYTE*)chTemp, sizeof(BOOL), PL_FUNC_LOCK); 
		if(nRet > 0) 
		{ 
			bRet = TRUE; 
		} 
		if(!bPause) Resume(); 
	} 
	return bRet; 
} 
 
BOOL CPeeperWnd::T_CopyFileToRemote(char *chFileSrc, char *chFileDes, HWND hNotifyWnd) 
{ 
	BOOL bRet = FALSE; 
	if(m_sckClient[0] != INVALID_SOCKET) 
	{ 
		BOOL bPause = IsPause(); 
		if(!bPause)  Pause(); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], (BYTE*)chFileDes,  
			strlen(chFileDes), PL_FUNC_FILE_COPY_S); 
		if(nRet > 0) 
		{ 
			BYTE chTemp[10]; 
			ZeroMemory(chTemp, 10); 
			int nPort = m_uPort+2; //可以自己设置接收的发送文件的端口 
			memcpy(chTemp, &nPort, sizeof(int)); 
			nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)); 
			if(nRet > 0) 
			{ 
				nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 10, NULL); 
				::Sleep(500); 
				bRet = ::PL_CopyFileClient(m_strIP, nPort, chFileSrc, TRUE, hNotifyWnd); 
			} 
		} 
		if(!bPause) Resume(); 
	} 
	return bRet; 
} 
 
BOOL CPeeperWnd::T_CopyFileFromRemote(char *chFileSrc, char *chFileDes, HWND hNotifyWnd) 
{ 
	BOOL bRet = FALSE; 
	if(m_sckClient[0] != INVALID_SOCKET) 
	{ 
		BOOL bPause = IsPause(); 
		if(!bPause)  Pause(); 
		int nRet = ::PL_SendSocketData(m_sckClient[0], (BYTE*)chFileSrc,  
			strlen(chFileSrc), PL_FUNC_FILE_COPY_C); 
		if(nRet > 0) 
		{ 
			BYTE chTemp[10]; 
			ZeroMemory(chTemp, 10); 
			int nPort = m_uPort+2; //可以自己设置接收的发送文件的端口 
			memcpy(chTemp, &nPort, sizeof(int)); 
			nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)); 
			if(nRet > 0) 
			{ 
				nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 10, NULL); 
				::Sleep(500); 
				bRet = ::PL_CopyFileClient(m_strIP, nPort, chFileDes, FALSE, hNotifyWnd); 
			} 
		} 
		if(!bPause) Resume(); 
	} 
	return bRet; 
} 
 
BOOL CPeeperWnd::T_DeleteFile(char *chFile) 
{ 
	BOOL bRet = FALSE; 
	if(m_sckClient[0] != INVALID_SOCKET) 
	{ 
		BOOL bPause = IsPause(); 
		if(!bPause)  Pause(); 
		 
		int nRet = SendData((BYTE*)chFile, strlen(chFile), PL_FUNC_FILE_DELETE); 
		if(nRet > 0) 
		{ 
			BYTE chTemp[10]; 
			ZeroMemory(chTemp, 10); 
			nRet = ReadData(chTemp, 10, NULL); 
			if(nRet > 0) 
			{ 
				bRet = *((BOOL*)(chTemp+1)); 
				bRet = !!bRet; 
			} 
		} 
		if(!bPause) Resume(); 
	} 
	return bRet; 
} 
 
BOOL CPeeperWnd::T_MoveFile(char *chFileSrc, char *chFileDes) 
{ 
	BOOL bRet = FALSE; 
	if(m_sckClient[0] != INVALID_SOCKET) 
	{ 
		BOOL bPause = IsPause(); 
		if(!bPause)  Pause(); 
		 
		int nRet = SendData((BYTE*)chFileSrc, strlen(chFileSrc), PL_FUNC_FILE_MOVE); 
		if(nRet > 0) 
		{ 
			nRet = SendData((BYTE*)chFileDes, strlen(chFileDes)); 
			if(nRet > 0) 
			{ 
				BYTE chTemp[10]; 
				ZeroMemory(chTemp, 10); 
				nRet = ReadData(chTemp, 10, NULL); 
				if(nRet > 0) 
				{ 
					bRet = *((BOOL*)(chTemp+1)); 
					bRet = !!bRet; 
				} 
			} 
		} 
		if(!bPause) Resume(); 
	} 
	return bRet; 
}