APP下载

Windows7平台下机房屏幕广播软件设计

2014-07-28罗新

电脑知识与技术 2014年16期

罗新

摘要:利用Windows7提供的桌面共享API,提出一个屏幕广播的解决方案。通过软件在机房的测试结果表明,屏幕广播的效果很好,可以满足教学的需要。

关键词:Windows7;桌面共享API;屏幕广播

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)16-3789-02

Abstract: By using desktop sharing API provided by Windows7, propose a solution for screen broadcast, software test results in lab show that, the effect of screen broadcast is good, it can meet the needs of teaching.

Key words: Windows7; Desktop Sharing API; Screen Broadcast

1 概述

机房教学中很多时候都需要把教师电脑的屏幕内容共享至学生机,主要解决了投影仪教学中,后排学生看不清教学内容的问题,这对于一些需要实操演示的课程(如编程课程)具有重要意义。如果通过某种编程语言,调用传统的Windows底层的API接口来实现一个高效稳定的屏幕广播程序,需要解决的问题很多,包括:屏幕图像的获取、压缩,图像数据的分块及组合,数据网络传输效率等,所以开发的难度较大。从Windows Vista操作系统开始,微软的终端服务提供基于RDP(Remote Desktop Protocol)的远程桌面共享API。利用这些API中几个主要对象的方法,可以方便实现桌面共享,应用共享,以及远程控制等。该文以VS2008作为开发工具并结合该API,设计并实现了一个运行在Windows7下的机房屏幕广播软件。

2 桌面共享API重要对象及方法

屏幕广播所涉及到的API都是由RdpEncom.dll发布的,它是Win7系统自带的一个动态链接库文件。要想实现屏幕广播,有两个重要的对象需要创建,分别是IRDPSRAPISharingSession及IRDPSRAPIViewer。前者是COM对象,它实现了屏幕的共享。后者是一个ActiveX控件,它可以嵌入到运行于学生机的窗口程序中,实现屏幕广播的接收。屏幕广播的执行流程如下,首先由IRDPSRAPISharingSession创建一个RDPSession实例,然后订阅桌面共享API相关的一些事件及定义事件处理方法,如OnAttendeeConnected,OnAttendeeConnected,OnControlLevelChangeRequest等,分别表示有客户端连接,断开及控制级别改变请求的事件。在RDPSession执行Open方法之后,屏幕共享开启,此时还需要创建一个邀请(Invitation),邀请里面包括了连接串,组名,密码等信息。客户端只有获取这个邀请之后,才能连接到进行屏幕共享的主控端,进而接收到屏幕广播。邀请的产生可以通过IRDPSRAPIInvitationManager接口的CreateInvitation方法产生,该方法的参数如下所示。

HRESULT CreateInvitation(

[in] BSTR bstrAuthString,

[in] BSTR bstrGroupName,

[in] BSTR bstrPassword,

[in] long AttendeeLimit,

[out] IRDPSRAPIInvitation **ppInvitation

);

其中bstrAuthString表示授权串,对于每个屏幕广播会话都是唯一的。bstrGroupName实现客户端的分组,bstrPassword表示会话的密码(可以为空),AttendeeLimit表示接收端的最大个数。ppInvitationg指向另一个邀请串,一般不会用到。下面是一个邀请产生实例,使用的编程语言是C#。

IRDPSRAPIInvitation pInvitation= m_pRdpSession.Invitations.CreateInvitation("myauthstring", "Group1", "", 50);

这个实例产生了一个授权串为myauthstring,组名为Group1,密码为空,最大客户端为50的邀请。客户端获得这个邀请后,再调用IRDPSRAPIViewer的Connect方法,即可连接到屏幕广播主控端,从而接收到屏幕广播。

3 屏幕广播软件的实现

根据前面的分析,屏幕广播软件的实现应该包括教师端及学生端。教师端负责屏幕广播的控制,学生端则接收来自教师端的屏幕广播。为了确保不同机房同时使用时不产生干扰,可以为每个学生机设置一个频道号,学生机只接收与自己频道号一致的教师端广播。屏幕广播采用UDP广播的方式进行,教师端启用屏幕广播后,首先生成一个邀请串,然后把自己的频道号与邀请串联结成一个字符串,最后通过UDP广播发送。学生机获得这个UDP数据包后,提取里面的字符串内容,分解出频道号及邀请串,然后与自己的频道号进行比较,只有在频道号一致的情况下,才通过邀请串连接到教师机,接收屏幕广播。下面是教师端的主要代码:

m_pRdpSession = new RDPSession();

m_pRdpSession.OnAttendeeConnected+=

new_IRDPSessionEvents_OnAttendeeConnectedEventHandler(OnAttendeeConnected);endprint

m_pRdpSession.OnAttendeeDisconnected +=

new_IRDPSessionEvents_OnAttendeeDisconnectedEventHandler(OnAttendeeDisconnected);

m_pRdpSession.OnControlLevelChangeRequest +=

new_IRDPSessionEvents_OnControlLevelChangeRequestEventHandler(OnControlLevelChangeRequest);

m_pRdpSession.Open();

IRDPSRAPIInvitation pInvitation = m_pRdpSession.Invitations.CreateInvitation("WinPresenter","PresentationGroup", "", 5);

string invitationString = pInvitation.ConnectionString;

if(ChannelNo<=9)

strChannelNo="0"+ChannelNo.ToString();

else

strChannelNo=ChannelNo.ToString();

string strDataPacket = strChannelNo + invitationString;

udp_sender = new UdpClient();

Byte[] buffer = System.Text.Encoding.ASCII.GetBytes(strDataPacket);

udp_sender.Send(buffer, buffer.Length, iep);

对于客户端,除了用UDPClient接收并处理来自教师端的邀请串,然后就是调用IRDPSRAPIViewer的Connect方法连接至教师端,例如下面语句实现了连接到教师端的功能:

pRDPViewer.Connect(invitestr, "viewer1", "");

其中pRDPViewer是控件的名字。在使用VS2008创建工程时,注意要添加对RdpEncom.dll引用。

4 小结

本文利用微软提供的桌面共享API,提出了一个运行在Windows7平台下的屏幕广播解决方案,通过软件在机房中的使用测试,屏幕广播的效果不错,广播延时很小,图像质量也可以接受。而整个开发过程却相当简单及高效,这为我们提供了开发屏幕广播软件的新思路。

参考文献:

[1] 陈绍钧.屏幕广播技术在演示教学系统中的应用[J].实验室科学,2008(8):144-146.

[2] 张军翔,刘兴红.屏幕广播教学系统在计算机类课程实验教学中的应用研究[J].湖北师范学院:自然科学版,2013,33(4):100-104.endprint