基于C#编写一个远程桌面应用

 更新时间:2023年10月24日 08:27:28   作者:每日出拳老爷子  
封闭环境无法拷贝外来的远程桌面软件,所以这篇文章小编就来带大家用C#编写一个简单的远程桌面应用,感兴趣的小伙伴可以跟随小编一起学习一下

背景

封闭环境无法拷贝外来的远程桌面软件,所以就直接自己用C#写一个。

效果

说明

本篇会给出完整的编程步骤,照着写就能拥有你自己的远程桌面应用,直接可以运行在局域网。

如果不想自己敲代码,也可以选择直接下载项目资源,解包后直接用VS2019打开即可运行或自行打包成exe

设计

远程桌面需要一个服务端,一个客户端,各自是一个项目文件。
本项目中客户端分享画面(发送截屏数据流),服务端则是监听并接收画面,因此服务端需要两个Form(窗体)。

项目源码

客户端UI

只需要一个Form1,布局如下:

具体组件和属性设置如下:

  • Label1,text改为IP即可;
  • Label2,text改为Port即可;
  • textbox1,名称改为txtIP;
  • textbox2,名称改为txtPort,text改为80
  • button1,text改为Connect,名称改为btnConnect
  • button2,text改为ShareScreen,名称改为btnShare

客户端源码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Net.Sockets;
using System.Drawing.Imaging;
using System.Runtime.Serialization.Formatters.Binary;

namespace OriginalClient
{
    public partial class Form1 : Form
    {
        private readonly TcpClient client = new TcpClient();
        private NetworkStream mainStream;
        private int portNumber;

        private static Image GrabDesktop()
        {
            Rectangle bound = Screen.PrimaryScreen.Bounds;
            Bitmap screenshot = new Bitmap(bound.Width, bound.Height, PixelFormat.Format32bppArgb);
            Graphics graphics = Graphics.FromImage(screenshot);
            graphics.CopyFromScreen(bound.X, bound.Y, 0, 0, bound.Size, CopyPixelOperation.SourceCopy);

            return screenshot;
        }

        private void SendDesktopImage()
        {
            BinaryFormatter binFormatter = new BinaryFormatter();
            mainStream = client.GetStream();
            binFormatter.Serialize(mainStream, GrabDesktop());
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            btnShare.Enabled = false;

        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            portNumber = int.Parse(txtPort.Text);
            try
            {
                client.Connect(txtIP.Text, portNumber);
                btnConnect.Text = "Connected";
                MessageBox.Show("Connected");
                btnConnect.Enabled = false;
                btnShare.Enabled = true;
            }
            catch (Exception)
            {
                MessageBox.Show("Failed to connect");
                btnConnect.Text = "Not Connected";
            }
        }

        private void btnShare_Click(object sender, EventArgs e)
        {
            if (btnShare.Text.StartsWith("Share"))
            {
                timer1.Start();
                btnShare.Text = "Stop Sharing";
            }
            else 
            {
                timer1.Stop();
                btnShare.Text = "Share My Screen";
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            SendDesktopImage();
        }
    }
}

服务端UI Form1

  • textBox1,name设置为txtPort
  • button1,name设置为btnListen

Form1代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OriginalServer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btnListen_Click(object sender, EventArgs e)
        {
            new Form2(int.Parse(txtPort.Text)).Show();
            btnListen.Enabled = false;
        }
    }
}

Form2

源项目中追加一个窗体。

一个窗体里放一个imageBox,mode设置为zoom,dock设置为停靠。

Form2源码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Runtime.Serialization.Formatters.Binary;
namespace OriginalServer
{
    public partial class Form2 : Form
    {
        private readonly int port;
        private TcpClient client;
        private TcpListener server;
        private NetworkStream mainStream;
        private readonly Thread Listening;
        private readonly Thread GetImage;
        public Form2(int Port)
        {
            port = Port;
            client = new TcpClient();
            Listening = new Thread(StartListening);
            GetImage = new Thread(Receiveimage);
            InitializeComponent();
        }
        private void StartListening()
        {
            while (!client.Connected) 
            {
                server.Start();
                client = server.AcceptTcpClient();
            }
            GetImage.Start();
        }
        private void StopListening() 
        {
            server.Stop();
            client = null;
            if (Listening.IsAlive) Listening.Abort();
            if (GetImage.IsAlive) Listening.Abort();
        }
        private void Receiveimage()
        {
            BinaryFormatter binFormatter = new BinaryFormatter();
            while (client.Connected) 
            {
                mainStream = client.GetStream();
                pictureBox1.Image = (Image)binFormatter.Deserialize(mainStream);
            }
        }
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            server = new TcpListener(IPAddress.Any, port);
            Listening.Start();
        }
        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            base.OnFormClosing(e);
            StopListening();
        }
        private void pictureBox1_Click(object sender, EventArgs e)
        {
        }
        private void Form2_Load(object sender, EventArgs e)
        {
        }
    }
}

到此这篇关于基于C#编写一个远程桌面应用的文章就介绍到这了,更多相关C#远程桌面内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于C#实现屏幕桌面截图

    基于C#实现屏幕桌面截图

    这篇文章主要为大家详细介绍了如何利用C#实现屏幕桌面截图以及左上角区域截图功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C# 超高面试题收集整理

    C# 超高面试题收集整理

    C# 超高面试题,学习c sharp的朋友可以看下,有说明地方的不足。是不是所有问题都有自己的解决方法。
    2010-03-03
  • C#中一个方法返回多个值的实现方法小结

    C#中一个方法返回多个值的实现方法小结

    通常一个方法只能返回一个值,但是如果在某些时候,我们想要返回多个值,例如某个方法将一个浮点数分割成一个整数和一个小数返回,因此本文给大家介绍了C#中一个方法返回多个值的实现方法及示例代码,需要的朋友可以参考下
    2024-05-05
  • C# DataTable常见用法汇总

    C# DataTable常见用法汇总

    这篇文章主要介绍了C# DataTable常见用法,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-08-08
  • C#方法中参数ref和out详解

    C#方法中参数ref和out详解

    这篇文章主要为大家详细介绍了C#方法中参数ref和out的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • C#使用Winform编写一个图片预览器管理

    C#使用Winform编写一个图片预览器管理

    这篇文章主要为大家详细介绍了C#如何使用Winform编写一个通用图片预览器管理,包含滚轮放大缩小,剪切,下一页,方向变化等,需要的可以参考下
    2024-02-02
  • C#语言async await工作原理示例解析

    C#语言async await工作原理示例解析

    这篇文章主要为大家介绍了C#语言async await工作原理示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • C#实现Windows服务测试与调试

    C#实现Windows服务测试与调试

    这篇文章介绍了C#实现Windows服务测试与调试的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C#由当前日期计算相应的周一和周日的实例代码

    C#由当前日期计算相应的周一和周日的实例代码

    这篇文章介绍了C#由当前日期计算相应的周一和周日的实例代码,有需要的朋友可以参考一下
    2013-09-09
  • Unity实现移动端手势解锁功能

    Unity实现移动端手势解锁功能

    这篇文章主要为大家详细介绍了Unity实现移动端手势解锁功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07

最新评论