之前写过一篇使用C# UDP 组播技术做的桌面广播实现, C# 使用UDP组播实现局域网桌面共享。最终效果差强人意,UDP包在不同的交换机上发送还会出现发送失败的情况,所以又重新研究了一些新的方法,包括只发送差异画面的方法,但是依然无法组播。后来搜索到一篇论文,使用RDP技术进行的桌面广播,实验了一下,效果出奇的好,是微软自家的技术,但是必须在Windows 7 及以上版本才能使用,不过,这似乎不再是个问题。

核心机制

1)服务端,开启一个RDPSession,然后做一个Invitatioon,会产生一个ConnectionString,把这个连接串发送到客户端

2)客户端,使用RDPViewer(是一个ActiveX),使用连接字符串连接

没错,就这么简单。

下面以Winform为例

1)创建一个Winform工程作为服务端,添加rdpcomapi 库的引用;

启动桌面共享的代码:

_rdpSession = new RDPSession();  // 新建RDP Session

_rdpSession.SetDesktopSharedRect(rect.X, rect.Y, rect.Right, rect.Bottom); // 设置共享区域,如果不设置默认为整个屏幕,当然如果有多个屏幕,还是设置下主屏幕,否则,区域会很大

_rdpSession.Open(); // 打开会话

IRDPSRAPIInvitation invitation = _rdpSession.Invitations.CreateInvitation("baseAuth", "groupName", "", );  // 创建申请

invitation.ConnectionString 就是可以连接到该会话的连接字符串,不管是用广播还是其他机制,发送到客户端即可

客户端拿到这个连接字符串之后,即可连接到该桌面共享。

2)创建一个Winform程序,在Form上放一个控件,首先在左侧的Toolbox面板上右键,选择“Choose Items”,然后选择 “COM Components”,找到“RDP Viewer Class”,然后确认,再到Form上画一下

即可创建一个该控件的实例,注意需要将该控件的AccessibleRole改为None,否则调用可能会出错。

连接代码:

axRDPViewer1.Connect(args.ConnectionString, Environment.UserName, "");

即可连接到该桌面会话,这样子就可以看到共享主机的画面啦,效果可是能达到Windows远程桌面级别的。

--------------

事件处理:

RDPSession端,可处理的事件有

 _rdpSession.OnAttendeeConnected += RdpSessionOnOnAttendeeConnected; // 有加入者连接
_rdpSession.OnAttendeeDisconnected += RdpSessionOnOnAttendeeDisconnected; // 有连接者断开
_rdpSession.OnControlLevelChangeRequest += RdpSessionOnOnControlLevelChangeRequest; // 连接者控制级别改变,如果只是桌面查看,只需要给 CTRL_LEVEL_VIEW 权限即可

Viewer端,可处理的事件有:

axRDPViewer1.OnConnectionEstablished += AxRdpViewer1OnOnConnectionEstablished; // 建立连接
axRDPViewer1.OnConnectionFailed += AxRdpViewer1OnOnConnectionFailed; // 连接失败
axRDPViewer1.OnConnectionTerminated += AxRdpViewer1OnOnConnectionTerminated; // 连接中断
axRDPViewer1.OnError += AxRdpViewer1OnOnError; // 连接错误

---------------

另外,这个Session还可以实现远程控制,这些内容可查看MSDN上的参考来实现。

如果要在WPF工程中使用,首先要创建一个WindowsForm的控件库,把ActiveX嵌进去,然后包装一下,再在WPF工程使用使用WindowsFormHost控件来承载该控件即可。

参考文献:

https://blogs.msdn.microsoft.com/rds/2007/03/23/writing-a-desktop-sharing-application/

参考代码:下载

[原创] 基于RDP的桌面广播的更多相关文章

  1. 基于RDP瘦客户机协议的简要说明

    **************************************************************************************************** ...

  2. 基于RDP开源许可rdesktop基本介绍

    **************************************************************************************************** ...

  3. 基于CefGlue的桌面应用开发

    原文地址:http://johnnyfee.github.io/csharp/2013/12/21/cef-glue/ 前言 如果你想使用WEB技术来开发桌面客户端,并且是想使用的语言也是C#时,那请 ...

  4. [原创]基于VueJs的前后端分离框架搭建之完全攻略

    首先请原谅本文标题取的有点大,但并非为了哗众取宠.本文取这个标题主要有3个原因,这也是写作本文的初衷: (1)目前国内几乎搜索不到全面讲解如何搭建前后端分离框架的文章,讲前后端分离框架思想的就更少了, ...

  5. 修改微软RDP远程桌面端口

    远程桌面服务所使用的通信协议是Microsoft定义RDP(Remote Desktop Protocol)协议,RDP协议的TCP通信端口号是3389. 有时候为了安全起见,或者其他的需要,我们常需 ...

  6. 基于Svelte3.x桌面端UI组件库Svelte UI

    Svelte-UI,一套基于svelte.js开发的桌面pc端ui组件库 最近一直忙于写svelte-ui,一套svelte3开发的桌面端ui组件库.在设计及功能上借鉴了element-ui组件库.所 ...

  7. (原创)基于FPGA的调光流水灯(Verilog,CPLD/FPGA)

    1.Abstract     前几天做了一个呼吸灯,觉得确实挺有意思的:可惜的是只有一个灯管亮,板子上有四个灯,要是能让这些灯有序地亮起来,那应该更有趣味了!跟传统的一样,逻辑上做成一个流水灯的样式, ...

  8. (原创)基于MCU的频率可调,占空比可调的PWM实现(MCU,MCS-51/MSP430)

    1.Abstract     做这个是受朋友之邀,用在控制电机转动的方面.他刚好在一家好的单位实习,手头工作比较多,无暇分身,所以找我帮忙做个模型.要求很明晰,PWM的频率在0~1KHz范围内,占空比 ...

  9. [原创]基于SpringAOP开发的方法调用链分析框架

    新人熟悉项目必备工具!基于SpringAOP开发的一款方法调用链分析插件,简单到只需要一个注解,异步非阻塞,完美嵌入Spring Cloud.Dubbo项目!再也不用担心搞不懂项目! 很多新人进入一家 ...

随机推荐

  1. 手脱nSPack 3.7

    方法一: 1.   OD查壳—nSpack3.7的壳 2. 载入OD 看起来很眼熟,F8一次,然后下面就可以使用ESP定律了,使用ESP定律下断点,然后F9四次 3.   F9四次后落到这个位置 接下 ...

  2. TersorflowTutorial_MNIST数据集上简单CNN实现

    MNIST数据集上简单CNN实现 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Tensorflow机器学习实战指南 源代码请点击下方链接欢迎加星 Tesorflow实现基于MNI ...

  3. Redis 安装碰到问题

    一 make 报错 1. 出现如下错误 : cd src && make all make[1]: Entering directory '/xx/xx/redis-x.x.x/src ...

  4. CF540 D 概率 DP

    石头剪刀布三种生物(?) 随机战斗,最后三方各自只有自己方存活下来的概率是多少. 局面的转移明显,注意任选两方决定战斗时有可能出现选了同个种类的,因此注意排除掉同种的组合,也就是条件概率什么的. /* ...

  5. 【leetcode 简单】第三十四题 只出现一次的数字

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  6. 伪ajax操作

    什么是伪Ajax操作? 说白了就是假的ajax操作,但是它和正常的ajax操作的目的是一样的,把前端的信息发送到后台 先看一下代码吧! ajax.html <form action=" ...

  7. Sublime text 2/3 SVN插件及使用方法

    Sublime Text是前端利器,作为前端的盆友们已经再熟悉不过了,在项目中经常使用SVN,每次都要切换提交,很麻烦,有了这个SVN插件就很方便了,使用快捷方式提交,更新. Sublime Text ...

  8. python 输出 a+b

    AC代码: 单组输入: s=input().split() print(int(s[0])+int(s[1]))

  9. 技巧之如何快速使用websocket来监控标准输出

    为啥是Websocket 服务端可以主动推送消息到浏览器端.比如服务端实时在打印日志,这是一个标准输出,可以实时将日志推送到浏览器. 为啥用websocketd (https://github.com ...

  10. docker之安装和基本使用(一)

    前言 开始折腾docker. 主要概念 容器:独立运行的一个或一组应用,与其他应用完全独立. 镜像:用于创建 Docker容器的模板. 仓库:用于收纳镜像文件,可以理解为代码控制中的代码仓库 注意: ...