当前位置:编程学习 > C#/ASP.NET >>

C#中如何实现C/S系统“监控对方屏幕”??

C#中如何实现C/S系统“监控对方屏幕”??

请给个思路  和 要用到哪些技术……。。


本人刚入门,希望大家指导

谢谢 --------------------编程问答--------------------
 大家说说啊


我现在是利用WINDOWS的API函数 截屏,然后发送JPG文件回去显示……

不是很好啊 --------------------编程问答--------------------
  呵呵 ,本人刚学会怎么用远程监控控件,做,还不会..帮顶. --------------------编程问答-------------------- 我不会,关注 --------------------编程问答-------------------- 1、屏幕分割成16块,然后分别监控数据,如果发现某一块变化则抓取,然后回传监控端(C#屏幕抓取,图像对比)
2、远程回传,通信模块~
--------------------编程问答-------------------- 简单的
1.截取屏幕技术,一般一秒截一次就可以了
2.图片压缩技术,压成JPEG就可以了,因为图片太大会影响到传输速度
3.文件传输技术,可以考虑UDP、TCP/IP、Socket

根据技术到网上去相应的资料,很多的。

复杂一点的,在简单的基础上再加上:
4.图像对比,将本次截图和上次截图对比,可以减少传输量,适合于互联网传输
5.文件压缩技术,自己写算法,对传输的文件进行压缩。好像没必要吧,zip组件就可以了
6.突破防火墙,又不是搞木马,没这个必要吧
7.隐藏自己,不要被杀毒软件发现了。靠,就是在搞木马了 --------------------编程问答--------------------
Server端 接收


//监听按钮
private void btnListen_Click(object sender, System.EventArgs e)
{
address = IPAddress.Parse(this.txtAddress.Text.Trim());
port = int.Parse(this.txtPort.Text.Trim());

this.statusBarPanel1.Text = "监听中……";


try
{
this.listener = new TcpListener(address,port);
this.listener.Start();

this.socket=this.listener.AcceptSocket();

if(this.socket.Connected) 
{
this.txtAddress.Enabled = false ;
this.txtPort.Enabled = false;
this.btnListen.Enabled = false;
this.btnListen.Text = "已连接";
this.statusBarPanel1.Text = "已经建立连接";

MessageBox.Show("客户端("+this.socket.RemoteEndPoint.ToString()+")已连接!\r\n");


this.stream = new NetworkStream(this.socket);
this.reader = new StreamReader(this.stream);




this.timer1.Start();

}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}

}



//一秒做一次
private void timer1_Tick(object sender, System.EventArgs e)
{
//接收文件
string str = this.reader.ReadToEnd();
//this.filecontent = "";
// do
// {
// this.filecontent += str + Environment.NewLine;
//
// }while((str = this.reader.ReadLine()) != "%%%End");

//保存文件

string filename = "c:\\temp.jpg";

System.Text.Encoding encoding = System.Text.Encoding.Default;
FileStream filestream = new FileStream(filename,FileMode.Create,FileAccess.Write);
StreamWriter sw = new StreamWriter(filestream,encoding);

sw.WriteLine(str);
sw.Flush();

sw.Close();
filestream.Close();


this.statusBarPanel1.Text = "文件接收成功! "+ DateTime.Now.ToLongTimeString();
this.pictureBox1.Image = Image.FromFile("c:\\temp.jpg");

}
--------------------编程问答--------------------
Client端 发送


[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]   
private   static   extern   bool   BitBlt   (   
IntPtr   hdcDest   ,   //目标设备的句柄   
int   nXDest   ,   //   目标对象的左上角的X坐标   
int   nYDest   ,   //   目标对象的左上角的X坐标   
int   nWidth   ,   //   目标对象的矩形的宽度   
int   nHeight   ,   //   目标对象的矩形的长度   
IntPtr   hdcSrc   ,   //   源设备的句柄   
int   nXSrc   ,   //   源对象的左上角的X坐标   
int   nYSrc   ,   //   源对象的左上角的X坐标   
System.Int32   dwRop   //   光栅的操作值   
)   ;   
    
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]   
private   static   extern   IntPtr   CreateDC   (   
string   lpszDriver   ,   //   驱动名称   
string   lpszDevice   ,   //   设备名称   
string   lpszOutput   ,   //   无用,可以设定位"NULL"   
IntPtr   lpInitData   //   任意的打印机数据   
)   ;   
    


private void btnListen_Click(object sender, System.EventArgs e)
{
string address 
= this.txtAddress.Text.Trim();
int port = int.Parse(this.txtPort.Text.Trim());

try
{
this.client = new TcpClient(address,port);


this.btnListen.Enabled = false;
this.btnListen.Text = "已连接";
this.txtAddress.Enabled = false ;
this.txtPort.Enabled = false;


this.stream = this.client.GetStream();
this.reader = new StreamReader(this.stream);
this.writer = new StreamWriter(this.stream);

this.timer1.Start();


}
catch(Exception ex) 
{
MessageBox.Show(ex.Message);
}
}

//一秒做一次
private void timer1_Tick(object sender, System.EventArgs e)
{
IntPtr   dc1   =   CreateDC("DISPLAY",null,null,(IntPtr)null);   
//创建显示器的DC   
Graphics   g1   =   Graphics.FromHdc(dc1);   
//由一个指定设备的句柄创建一个新的Graphics对象   
Bitmap   MyImage   =   new   Bitmap(Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height,g1);
//根据屏幕大小创建一个与之相同大小的Bitmap对象   
Graphics   g2   =   Graphics.FromImage(MyImage);   
//获得屏幕的句柄   
IntPtr   dc3   =   g1.GetHdc();   
//获得位图的句柄   
IntPtr   dc2   =   g2.GetHdc();   
//把当前屏幕捕获到位图对象中
BitBlt(dc2,0,0,Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height,dc3,0,0,13369376);
//把当前屏幕拷贝到位图中
g1.ReleaseHdc(dc3);   
//释放屏幕句柄
g2.ReleaseHdc(dc2);   
//释放位图句柄   

MyImage.Save("c:\\MyJpeg.jpg",ImageFormat.Jpeg);
this.label3.Text = "图片已保存到c:\\MyJpeg.jpg  " + DateTime.Now.ToLongTimeString();

sendpic();

}

void sendpic()
{
try
{
string filename = "c:\\MyJpeg.jpg";

System.Text.Encoding encoding = System.Text.Encoding.Default;
FileStream filestream = new FileStream(filename,FileMode.Open);
StreamReader sr = new StreamReader(filestream,encoding);

this.writer.WriteLine(sr.ReadToEnd());
this.writer.Flush();

this.writer.WriteLine("%%%End");
this.writer.Flush();

sr.Close();
filestream.Close();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
--------------------编程问答--------------------
为什么不行呢

有什么问题
大家帮帮忙 谢谢 --------------------编程问答-------------------- ????????????????????????
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,