[原创] 基于RDP的桌面广播
之前写过一篇使用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的桌面广播的更多相关文章
- 基于RDP瘦客户机协议的简要说明
**************************************************************************************************** ...
- 基于RDP开源许可rdesktop基本介绍
**************************************************************************************************** ...
- 基于CefGlue的桌面应用开发
原文地址:http://johnnyfee.github.io/csharp/2013/12/21/cef-glue/ 前言 如果你想使用WEB技术来开发桌面客户端,并且是想使用的语言也是C#时,那请 ...
- [原创]基于VueJs的前后端分离框架搭建之完全攻略
首先请原谅本文标题取的有点大,但并非为了哗众取宠.本文取这个标题主要有3个原因,这也是写作本文的初衷: (1)目前国内几乎搜索不到全面讲解如何搭建前后端分离框架的文章,讲前后端分离框架思想的就更少了, ...
- 修改微软RDP远程桌面端口
远程桌面服务所使用的通信协议是Microsoft定义RDP(Remote Desktop Protocol)协议,RDP协议的TCP通信端口号是3389. 有时候为了安全起见,或者其他的需要,我们常需 ...
- 基于Svelte3.x桌面端UI组件库Svelte UI
Svelte-UI,一套基于svelte.js开发的桌面pc端ui组件库 最近一直忙于写svelte-ui,一套svelte3开发的桌面端ui组件库.在设计及功能上借鉴了element-ui组件库.所 ...
- (原创)基于FPGA的调光流水灯(Verilog,CPLD/FPGA)
1.Abstract 前几天做了一个呼吸灯,觉得确实挺有意思的:可惜的是只有一个灯管亮,板子上有四个灯,要是能让这些灯有序地亮起来,那应该更有趣味了!跟传统的一样,逻辑上做成一个流水灯的样式, ...
- (原创)基于MCU的频率可调,占空比可调的PWM实现(MCU,MCS-51/MSP430)
1.Abstract 做这个是受朋友之邀,用在控制电机转动的方面.他刚好在一家好的单位实习,手头工作比较多,无暇分身,所以找我帮忙做个模型.要求很明晰,PWM的频率在0~1KHz范围内,占空比 ...
- [原创]基于SpringAOP开发的方法调用链分析框架
新人熟悉项目必备工具!基于SpringAOP开发的一款方法调用链分析插件,简单到只需要一个注解,异步非阻塞,完美嵌入Spring Cloud.Dubbo项目!再也不用担心搞不懂项目! 很多新人进入一家 ...
随机推荐
- Spring MVC POJO入参过程分析
SpringMVC确定目标方法POJO类型的入参过程 1.确认一个key: (1).若目标方法的POJO类型的参数没有使用@ModelAttribute作为修饰,则key为POJO类名第一个字母的小写 ...
- php开启压缩gzip
php服务的开启压缩,节省带宽 看是否开启压缩的网站 http://www.cnblogs.com/GaZeon/p/5421906.html 找到php.ini,修改下面的 ,重启php-fpm z ...
- 12.UiAutomator 获取系统信息
一.Build构建信息 1.build类: Build类提供了硬件厂商.编号.序列号.SDK版本等重要信息. 类名:android.os.Build 常量名 说明 BOARD 底层板名称 BOOTLO ...
- Qt ------ stylesheet 样式
1.所有的窗口组件都可以用 setStyleSheet() 设置样式 2.使用样式,显示效果可以不受平台影响,比如保证window 7 和 linux 显示效果是一样的 QVariant 如果 sty ...
- PL/SQL Developer 中的问题:Initialization error Could not load ".../oci.dll"解决方法
---------------------------------------------------------------------------------------------------- ...
- bash高级
重定向 管道: ps -ef | grep bash 管道作为命令衔接的 两个都写 ,一个到文件,一个到屏幕 tee null
- Intellij IDEA 快捷键整理(转)
Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式时按 “!”键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文件 Shift+Click,可以关闭文件 C ...
- 爬虫实战--利用Scrapy爬取知乎用户信息
思路: 主要逻辑图:
- java使用simpleDateFormat格式化日期 时间
时间日期标识符: yyyy:年 MM:月 dd:日 hh:1~12小时制(1-12) HH:24小时制(0-23) mm:分 ss:秒 S:毫秒 E:星期几 D:一年中的第几天 F:一月中的第几个星期 ...
- 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 ...