之前写过一篇使用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. joomla! 3.X 开发系列教程

    http://www.mengyunzhi.com/members-resource/joomla/87-joomla-menu-study.html 学习地址 http://blog.csdn.ne ...

  2. Servlet 介绍

    JSP 的本质就是 Servlet,开发者把编写好的 JSP 页面部署在 Web 容器中后,Web 容器会将 JSP 编译成对应的 Servlet. Servlet 的开发 Servlet 是个特殊的 ...

  3. struts的status属性

    struts2 <s:iterator> status属性 转载▼   iterator标签主要是用于迭代输出集合元素,如list set map 数组等,在使用标签的时候有三个属性值得我 ...

  4. JS中的匿名函数自执行、函数声明与函数表达式

    先看一段jQuery源码中匿名函数自执行的例子: (function( window, undefined ) { // jquery code })(window); 另外一种常见的写法: +fun ...

  5. Java enum的用法详解 (转)

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  6. ECNA-A- Abstract Art

    题目描述 Arty has been an abstract artist since childhood, and his works have taken on many forms. His l ...

  7. 1.ideal常用快捷键

    Alt+回车 导入包,自动修正Ctrl+N   查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L  格式化代码 Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如ge ...

  8. jQuery面向对象的写法

    定义的写法 //构造函数 function test(){ //construct code } //初始化方法 test.prototype.init = function(){ //init co ...

  9. Css Sprite 图片等比缩放图片大小

    图片大小80*40,即每张图片大小40*40,如何以20*20显示图片?1. 首先看下如何以40*40显示第二张图片: 正常显示css代码 .sprite { background-image: ur ...

  10. CodeForces 990C

    Description A bracket sequence is a string containing only characters "(" and ")" ...