之前写过一篇使用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. Spring MVC POJO入参过程分析

    SpringMVC确定目标方法POJO类型的入参过程 1.确认一个key: (1).若目标方法的POJO类型的参数没有使用@ModelAttribute作为修饰,则key为POJO类名第一个字母的小写 ...

  2. php开启压缩gzip

    php服务的开启压缩,节省带宽 看是否开启压缩的网站 http://www.cnblogs.com/GaZeon/p/5421906.html 找到php.ini,修改下面的 ,重启php-fpm z ...

  3. 12.UiAutomator 获取系统信息

    一.Build构建信息 1.build类: Build类提供了硬件厂商.编号.序列号.SDK版本等重要信息. 类名:android.os.Build 常量名 说明 BOARD 底层板名称 BOOTLO ...

  4. Qt ------ stylesheet 样式

    1.所有的窗口组件都可以用 setStyleSheet() 设置样式 2.使用样式,显示效果可以不受平台影响,比如保证window 7 和 linux 显示效果是一样的 QVariant 如果 sty ...

  5. PL/SQL Developer 中的问题:Initialization error Could not load ".../oci.dll"解决方法

    ---------------------------------------------------------------------------------------------------- ...

  6. bash高级

      重定向 管道:  ps  -ef | grep bash  管道作为命令衔接的 两个都写 ,一个到文件,一个到屏幕   tee  null

  7. Intellij IDEA 快捷键整理(转)

    Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式时按 “!”键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文件 Shift+Click,可以关闭文件 C ...

  8. 爬虫实战--利用Scrapy爬取知乎用户信息

    思路: 主要逻辑图:

  9. java使用simpleDateFormat格式化日期 时间

    时间日期标识符: yyyy:年 MM:月 dd:日 hh:1~12小时制(1-12) HH:24小时制(0-23) mm:分 ss:秒 S:毫秒 E:星期几 D:一年中的第几天 F:一月中的第几个星期 ...

  10. docker-It's possible that too few managers are online. Make sure more than half of the managers are online.

    问题:docker ---- It's possible that too few managers are online. Make sure more than half of the manag ...