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;
}