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#