【C#】【源码】直接可用的远程桌面应用

【背景】

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

【效果】

在这里插入图片描述

【说明】

本篇会给出完整的编程步骤,照着写就能拥有你自己的远程桌面应用,直接可以运行在局域网。
如果不想自己敲代码,也可以选择直接下载项目资源,解包后直接用VS2019打开即可运行或自行打包成exe:
https://download.csdn.net/download/weixin_41697242/88350078

【设计】

远程桌面需要一个服务端,一个客户端,各自是一个项目文件。
本项目中客户端分享画面(发送截屏数据流),服务端则是监听并接收画面,因此服务端需要两个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){}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/111431.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笔记1.5:计算机网络体系结构

从功能上描述计算机网络结构 分层结构 每层遵循某个网络协议完成本层功能 基本概念 实体:表示任何可发送或接收信息的硬件或软件进程。 协议是控制两个对等实体进行通信的规则的集合,协议是水平的。 任一层实体需要使用下层服务,遵循本层…

操作系统03-IO设备管理

中断源指的就是中断请求,所谓中断字是指中断请求的编号。 内存不足时候,OS可以采取“内存紧缩”进行改善。 进程控制块PCB组织管理一般采用线性方式。 7个状态模型增加就绪挂起和阻塞挂起的状态:1提高效率 2 提供足够的内存 3有利于调试 生…

【Linux入门】---Linux权限管理详解

文章目录 1.shell命令以及运行原理2.linux用户分类su指令切换用户 3.Linux权限管理3.1Linux文件访问者3.2文件类型和访问权限3.3文件权限值的表示方法3.4文件访问权限的相关设置方法chmod指令--权限修改方法①chmod指令--权限修改方法②chown指令chgrp指令umask指令file指令 4.…

R语言绘制热图

1、初步绘图 rm(listls())#clear Global Environment setwd(D:/Desktop/0000/code-main/热图)#设置工作路径#加载R包 library (pheatmap) #读取数据 df <- read.table(file"data.txt",sep"\t",row.names 1, headerT,check.namesFALSE) #查看前3行 hea…

idea启动缓慢解决办法

idea启动缓慢解决办法 文章目录 idea启动缓慢解决办法前言一、修改内存大小二、虚拟机运行大小三、插件禁用1、安卓相关2、构建工具3、Code Coverage 代码覆盖率4、数据库5、部署工具6、html和xml7、ide settings8、JavaScript框架和工具9、jvm框架10、Keymap快捷键映射11、kot…

ARM Linux DIY(十三)Qt5 移植

前言 板子带有屏幕&#xff0c;那当然要设计一下 GUI&#xff0c;对 Qt5 比较熟悉&#xff0c;那就移植它吧。 移植 Qt5 buildroot 使能 Qt5&#xff0c;这里我们只开启核心功能 gui module --> widgets module 编译 $ make ODIY_V3S/ qt5base编译报错&#xff1a;找不…

【项目经验】:elementui表格中数字汉字排序问题及字符串方法localeCompare()

一.需求 表格中数字汉字排序&#xff0c;数字按大小排列&#xff0c;汉字按拼音首字母&#xff08;A-Z&#xff09;排序。 二.用到的方法 第一步&#xff1a;把el-table-column上加上sortable"custom" <el-table-column prop"date" label"序号…

Ubuntu下高效Vim的搭建(离线版)

软件界面 可以看到界面下方有一些常用提示信息&#xff1a;文件路径、format、文件类型、光标所在的坐标(x,y)、进度条(百分比)、日期时间 会提示已定义的变量名词(快速补全) 搭建方法 下载资源文件 把Vim 和 .vimrc 拷贝到家目录下&#xff0c;并执行tar -xvf Vim 即可。 …

外星人入侵游戏-(创新版)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

『PyQt5-Qt Designer篇』| 09 Qt Designer中分割线和间隔如何使用?

09 Qt Designer中分割线和间隔如何使用? 1 间隔1.1 水平间隔1.2 垂直间隔2 分割线2.1 水平线2.2 垂直线3 保存并执行1 间隔 间隔有水平间隔和垂直间隔: 1.1 水平间隔 拖动4个按钮,并设置为水平布局: 在第一个按钮的右边添加一个水平间隔: 设置其sizeType为Fixed,宽度为20…

ipv6笔记及总结

1、路由器请求消息Router Solicitation和路由器通告Router Advertisement消息主要用于无状态地址的情况下&#xff0c;有状态的情况使用的是dhcpv6 server分配&#xff08;例如&#xff1a;IPv6地址以及其他信息&#xff08;DNS、域名等&#xff09;&#xff09;。 2、关于IPv…

Learn Prompt-Midjourney 图片生成

简介 随着 ChatGPT 的爆火&#xff0c;越来越多的人开始关注并尝试 AI 相关的应用。而图片生成就是其中一个备受瞩目的领域。目前已经有许多图像生成工具&#xff0c;如 Midjourney&#xff0c;Stable Diffusion&#xff0c;DALL-E&#xff0c;Firefly等。本课程主要是以 Midj…