设计局域网屏幕监控软件.docx
《设计局域网屏幕监控软件.docx》由会员分享,可在线阅读,更多相关《设计局域网屏幕监控软件.docx(26页珍藏版)》请在冰豆网上搜索。
![设计局域网屏幕监控软件.docx](https://file1.bdocx.com/fileroot1/2023-1/21/e0316ea4-d624-4d53-8253-496b3f24afbf/e0316ea4-d624-4d53-8253-496b3f24afbf1.gif)
设计局域网屏幕监控软件
计算机网络技术
——题目:
局域网屏幕监控软件
学院:
计算机科学与技术
班级:
计科0903
姓名:
张永辉
学号:
0908030319
日期:
2012年5月28
设计局域网屏幕监控软件
实现说明:
本程序所实现的功能就是将服务器所在计算机的屏幕活动反映到客户端的程序窗口中,屏幕监控就是在服务器端获取屏幕图像,然后转换成可在网络中传输的数据发送到客户端,客户端接收到服务器短发来的数据后再将起转换成图像信息,并绘制在指定的窗口上,就这样不断的接收数据,绘制图像就可以实现局域网屏幕监控软件。
技术要点:
实现这样的操作的存在两种方法,一种是将图片信息存入文件,再将文件发送到客户端;另一种方法是将图片信息存入内存,直接以内存数据发送到客户端。
图片信息由两部分组,及BITMAP结构信息和数据图片数据。
BITMAP结构可以通过CBitmap类直接获取,实现代码如下:
CDCdc,bmpdc;
intwidth,height;
dc.CreateDC(“DISPLAY”NULL,NULL,NULL);//创建关联屏幕的画布;
CBitmapbm;//位图类
width=GetSystemMetics(SM_CXSCREEN);//屏幕宽度
height=GetSystemMetics(SM_CYSCREEN);//屏幕高度
bm.CreatCompatibleBitmap(&dc,width,height);//创建与屏幕画布兼容的位图
bmpdc.CreatCompatibleDC(&dc);//创建与屏幕画布兼容的临时画布
bmpdc.SelectObject(bm);//选择位图
bmpdc.BibBlt(0,0,width,height&dc,0,0,SRCCOY)//将屏幕图像复制到临时画布
bm.GetBitmap(&bitmap);//获取位图结构
在获取图片数据是首先要设置BITMAPINFORMATIONHEADER结构信息,再利用GetDIBits函数通过BITMAPINFORMATIONHEADER结构获取图片数据,实现代码如下:
Bm.GetBitmap(&bitmap);//获取位图结构
size=bitmap.bmWidthBytes*bitmapHeight;//计算图片大小
bmpdata=newchar[size];//定义图片数据存储区
BITMAPINFORMATIONHEADERbih;//位图信息头结构
bihbiBitCount=bitmap.bmBitsPixel//图片像素位数
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=bitmap.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFORMATIONHEADER);
bih.biSizeImage=size;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;//获取图片数据
GetDIBits(dc,bm,0,bih,biHeight,bmpdata,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
在客户端也就是图片数据的接收端会根据接收到的BITMAP结构和图片数据通过SetDIBITS方法生成图片,实现代码如下:
SetDIBits(bmpdc.m_Hdc,bm,0,bih,biHeight,bmpdata,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
实现过程:
(1)新建一个基于对话框的工程,命名为server(服务器)。
(2)主要代码:
在窗口类中定义Getscreen方法来获取服务器端屏幕的图像即发送所需要的BITMAP结构和位图数据。
实现代码:
voidCServerDlg:
:
GetScreen()
{
CDCdc,bmpdc;//屏幕画布与临时画布
intwidth,height;//屏幕的宽度与高度
dc.CreateDC("DISPLAY",NULL,NULL,NULL);//根据屏幕上下文创建画布
CBitmapbm;//定义存储屏幕图形的位图
width=GetSystemMetrics(SM_CXSCREEN);//屏幕宽度
height=GetSystemMetrics(SM_CYSCREEN);//屏幕高度
bm.CreateCompatibleBitmap(&dc,width,height);
bmpdc.CreateCompatibleDC(&dc);//创建与屏幕画布相容的临时画布
bmpdc.SelectObject(&bm);
bmpdc.BitBlt(0,0,width,height,&dc,0,0,SRCCOPY);
bm.GetBitmap(&bitmap);
size=bitmap.bmWidthBytes*bitmap.bmHeight;
bmpdata=newchar[size];
BITMAPINFOHEADERbih;
bih.biBitCount=bitmap.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=bitmap.bmHeight;//位图高度
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=bitmap.bmWidth;//位图大小
bih.biXPelsPerMeter=0;//位图宽度
bih.biYPelsPerMeter=0;
GetDIBits(dc,bm,0,bih.biHeight,bmpdata,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
}
在窗口体中实现OnReceive方法用来接收客户端发送的命令并执行,该方法由CSocket类的子类CTCPClientSocket来调用,实现代码如下:
voidCServerDlg:
:
OnReceive(CSocket*socket,intnErrorCode)
{
charbuffer[255];
intlen=socket->Receive(buffer,255);//接收数据,并返回实现接受数据的长度
buffer[len]='\0';//添加结束符
switch(*buffer)
{
case'D':
SendBitData(socket);//发送图像数据
break;
case'M':
SendBitmap(socket);//发送位图结构
break;
default:
AfxMessageBox(buffer);
}
}
在OnReceive方法中分别调用SendBitData方法和SendBitmap方法,用来发送可组成图像的信息,代码如下:
voidCServerDlg:
:
SendBitData(CSocket*socket)
{
char*data=bmpdata;//指向图片数据的指针
intsendlen=0;//实际发送长度
intlen=0;//发送总长度
do
{
sendlen=socket->Send(data,size);//发送数据
len+=sendlen;
data+=sendlen;
}while(lendeletebmpdata;
bmpdata=NULL;
size=0;
}
voidCServerDlg:
:
SendBitmap(CSocket*socket)
{
GetScreen();
socket->Send(&bitmap,sizeof(BITMAP));
}
新建一个基于对话框的项目,命名为Screen(客户端)。
在窗口体中增加两个按钮控件和一个picture控件。
在窗口体中实现GetScreen方法用于向服务器发送命令,并接受数据。
实现代码:
voidCScreenDlg:
:
GetScreen()
{
char*buffer="M";//命令M获取BITMAP结构
clientsocket.Send(buffer,strlen(buffer));
clientsocket.Receive(&bitmap,sizeof(BITMAP));
size=bitmap.bmWidthBytes*bitmap.bmHeight;
bmpdata=newchar[size];//指定存储图像数据缓冲区
char*data=bmpdata;
intlen,receivelen;
len=receivelen=0;
buffer="D";
clientsocket.Send(buffer,strlen(buffer));
do
{
receivelen=clientsocket.Receive(data,size);
len+=receivelen;
data+=receivelen;
}while(lenDrawScreen();
deletebmpdata;
bmpdata=NULL;
size=0;
}
在窗口体中实现DrawScreen方法用于接收到得图像信息在窗体上的picture控件绘制图像,实现代码如下:
voidCScreenDlg:
:
DrawScreen()
{
CDC*dc=m_drawscreen.GetDC();//Picture控件画布
BITMAPINFOHEADERbih;
bih.biBitCount=bitmap.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=bitmap.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=bitmap.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
CBitmapbm;
bm.CreateBitmapIndirect(&bitmap);//根据位图结构创建位图
CDCbmpdc;
bmpdc.CreateCompatibleDC(dc);
SetDIBits(bmpdc.m_hDC,bm,0,bitmap.bmHeight,bmpdata,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
bmpdc.SelectObject(&bm);
CRectrect;
m_drawscreen.GetClientRect(&rect);//将图像绘制到Picture中
dc->StretchBlt(0,0,rect.Width(),rect.Height(),&bmpdc,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
}
在窗口中单击“开始获取”按钮,将开始和停止窗体OnTimer消息事件的运行,用来不断的获取图像信息并绘制,实现代码如下:
voidCScreenDlg:
:
OnStart()
{
clientsocket.Create();
run=false;
boolret=clientsocket.Connect("127.0.0.1",1033);
if(!
ret)
return;
this->SetTimer(0,1000,NULL);//运行OnTimer事件
}
voidCScreenDlg:
:
OnStop()
{
this->KillTimer(0);
clientsocket.ShutDown
(2);//停止OnTimer事件
clientsocket.Close();
}
voidCScreenDlg:
:
OnTimer(UINTnIDEvent)
{
if(nIDEvent!
=0)
return;
if(run)
return;
run=true;
GetScreen();//获取远程屏幕信息并绘制
run=false;
CDialog:
:
OnTimer(nIDEvent);
}
程序源代码:
服务器类:
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
enum{IDD=IDD_ABOUTBOX};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
END_MESSAGE_MAP()
CServerDlg:
:
CServerDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CServerDlg:
:
IDD,pParent)
{
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCServerDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CServerDlg,CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()
BOOLCServerDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
boolret=false;
serversocket.SetServerEvent(this);
ret=serversocket.Create(1033);
ret=serversocket.Listen();
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCServerDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
voidCServerDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
HCURSORCServerDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCServerDlg:
:
SendBitData(CSocket*socket)
{
char*data=bmpdata;
intsendlen=0;
intlen=0;
do
{
sendlen=socket->Send(data,size);
len+=sendlen;
data+=sendlen;
}while(lendeletebmpdata;
bmpdata=NULL;
size=0;
}
voidCServerDlg:
:
SendBitmap(CSocket*socket)
{
GetScreen();
socket->Send(&bitmap,sizeof(BITMAP));
}
voidCServerDlg:
:
OnReceive(CSocket*socket,intnErrorCode)
{
charbuffer[255];
intlen=socket->Receive(buffer,255);
buffer[len]='\0';
switch(*buffer)
{
case'D':
SendBitData(socket);
break;
case'M':
SendBitmap(socket);
break;
default:
AfxMessageBox(buffer);
}
}
voidCServerDlg:
:
GetScreen()
{
CDCdc,bmpdc;
intwidth,height;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmapbm;
width=GetSystemMetrics(SM_CXSCREEN);
height=GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc,
width,
height);
bmpdc.CreateCompatibleDC(&dc);
bmpdc.SelectObject(&bm);
bmpdc.BitBlt(0,0,width,height,&dc,0,0,SRCCOPY);
bm.GetBitmap(&bitmap);
size=bitmap.bmWidthBytes*bitmap.bmHeight;
bmpdata=newchar[size];
BITMAPINFOHEADERbih;
bih.biBitCount=bitmap.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=bitmap.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=bitmap.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
GetDIBits(dc,bm,0,bih.biHeight,bmpdata,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
}
classCServerApp:
publicCWinApp
{
public:
CServerApp();
public:
virtualBOOLInitInstance();
DECLARE_MESSAGE_MAP()
};
classCServerDlg:
publicCDialog,CTCPServerEvent
{
protected:
BITMAPbitmap;
intsize;
char*bmpdata;
voidGetScreen();
protected:
voidSendBitData(CSocket*socket);
voidSendBitmap(CSocket*socket);
public:
CTCPServerSocketserversocket;
CServerDlg(CWnd*pParent=NULL);//standardconstructor
virtualvoidOnReceive(CSocket*socket,intnErrorCode);
enum{IDD=IDD_SERVER_DIALOG};
protected: