羅新
摘要:利用Windows7提供的桌面共享API,提出一個(gè)屏幕廣播的解決方案。通過(guò)軟件在機(jī)房的測(cè)試結(jié)果表明,屏幕廣播的效果很好,可以滿足教學(xué)的需要。
關(guān)鍵詞:Windows7;桌面共享API;屏幕廣播
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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 概述
機(jī)房教學(xué)中很多時(shí)候都需要把教師電腦的屏幕內(nèi)容共享至學(xué)生機(jī),主要解決了投影儀教學(xué)中,后排學(xué)生看不清教學(xué)內(nèi)容的問(wèn)題,這對(duì)于一些需要實(shí)操演示的課程(如編程課程)具有重要意義。如果通過(guò)某種編程語(yǔ)言,調(diào)用傳統(tǒng)的Windows底層的API接口來(lái)實(shí)現(xiàn)一個(gè)高效穩(wěn)定的屏幕廣播程序,需要解決的問(wèn)題很多,包括:屏幕圖像的獲取、壓縮,圖像數(shù)據(jù)的分塊及組合,數(shù)據(jù)網(wǎng)絡(luò)傳輸效率等,所以開(kāi)發(fā)的難度較大。從Windows Vista操作系統(tǒng)開(kāi)始,微軟的終端服務(wù)提供基于RDP(Remote Desktop Protocol)的遠(yuǎn)程桌面共享API。利用這些API中幾個(gè)主要對(duì)象的方法,可以方便實(shí)現(xiàn)桌面共享,應(yīng)用共享,以及遠(yuǎn)程控制等。該文以VS2008作為開(kāi)發(fā)工具并結(jié)合該API,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)運(yùn)行在Windows7下的機(jī)房屏幕廣播軟件。
2 桌面共享API重要對(duì)象及方法
屏幕廣播所涉及到的API都是由RdpEncom.dll發(fā)布的,它是Win7系統(tǒng)自帶的一個(gè)動(dòng)態(tài)鏈接庫(kù)文件。要想實(shí)現(xiàn)屏幕廣播,有兩個(gè)重要的對(duì)象需要?jiǎng)?chuàng)建,分別是IRDPSRAPISharingSession及IRDPSRAPIViewer。前者是COM對(duì)象,它實(shí)現(xiàn)了屏幕的共享。后者是一個(gè)ActiveX控件,它可以嵌入到運(yùn)行于學(xué)生機(jī)的窗口程序中,實(shí)現(xiàn)屏幕廣播的接收。屏幕廣播的執(zhí)行流程如下,首先由IRDPSRAPISharingSession創(chuàng)建一個(gè)RDPSession實(shí)例,然后訂閱桌面共享API相關(guān)的一些事件及定義事件處理方法,如OnAttendeeConnected,OnAttendeeConnected,OnControlLevelChangeRequest等,分別表示有客戶端連接,斷開(kāi)及控制級(jí)別改變請(qǐng)求的事件。在RDPSession執(zhí)行Open方法之后,屏幕共享開(kāi)啟,此時(shí)還需要?jiǎng)?chuàng)建一個(gè)邀請(qǐng)(Invitation),邀請(qǐng)里面包括了連接串,組名,密碼等信息。客戶端只有獲取這個(gè)邀請(qǐng)之后,才能連接到進(jìn)行屏幕共享的主控端,進(jìn)而接收到屏幕廣播。邀請(qǐng)的產(chǎn)生可以通過(guò)IRDPSRAPIInvitationManager接口的CreateInvitation方法產(chǎn)生,該方法的參數(shù)如下所示。
HRESULT CreateInvitation(
[in] BSTR bstrAuthString,
[in] BSTR bstrGroupName,
[in] BSTR bstrPassword,
[in] long AttendeeLimit,
[out] IRDPSRAPIInvitation **ppInvitation
);
其中bstrAuthString表示授權(quán)串,對(duì)于每個(gè)屏幕廣播會(huì)話都是唯一的。bstrGroupName實(shí)現(xiàn)客戶端的分組,bstrPassword表示會(huì)話的密碼(可以為空),AttendeeLimit表示接收端的最大個(gè)數(shù)。ppInvitationg指向另一個(gè)邀請(qǐng)串,一般不會(huì)用到。下面是一個(gè)邀請(qǐng)產(chǎn)生實(shí)例,使用的編程語(yǔ)言是C#。
IRDPSRAPIInvitation pInvitation= m_pRdpSession.Invitations.CreateInvitation("myauthstring", "Group1", "", 50);
這個(gè)實(shí)例產(chǎn)生了一個(gè)授權(quán)串為myauthstring,組名為Group1,密碼為空,最大客戶端為50的邀請(qǐng)。客戶端獲得這個(gè)邀請(qǐng)后,再調(diào)用IRDPSRAPIViewer的Connect方法,即可連接到屏幕廣播主控端,從而接收到屏幕廣播。
3 屏幕廣播軟件的實(shí)現(xiàn)
根據(jù)前面的分析,屏幕廣播軟件的實(shí)現(xiàn)應(yīng)該包括教師端及學(xué)生端。教師端負(fù)責(zé)屏幕廣播的控制,學(xué)生端則接收來(lái)自教師端的屏幕廣播。為了確保不同機(jī)房同時(shí)使用時(shí)不產(chǎn)生干擾,可以為每個(gè)學(xué)生機(jī)設(shè)置一個(gè)頻道號(hào),學(xué)生機(jī)只接收與自己頻道號(hào)一致的教師端廣播。屏幕廣播采用UDP廣播的方式進(jìn)行,教師端啟用屏幕廣播后,首先生成一個(gè)邀請(qǐng)串,然后把自己的頻道號(hào)與邀請(qǐng)串聯(lián)結(jié)成一個(gè)字符串,最后通過(guò)UDP廣播發(fā)送。學(xué)生機(jī)獲得這個(gè)UDP數(shù)據(jù)包后,提取里面的字符串內(nèi)容,分解出頻道號(hào)及邀請(qǐng)串,然后與自己的頻道號(hào)進(jìn)行比較,只有在頻道號(hào)一致的情況下,才通過(guò)邀請(qǐng)串連接到教師機(jī),接收屏幕廣播。下面是教師端的主要代碼:
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);
對(duì)于客戶端,除了用UDPClient接收并處理來(lái)自教師端的邀請(qǐng)串,然后就是調(diào)用IRDPSRAPIViewer的Connect方法連接至教師端,例如下面語(yǔ)句實(shí)現(xiàn)了連接到教師端的功能:
pRDPViewer.Connect(invitestr, "viewer1", "");
其中pRDPViewer是控件的名字。在使用VS2008創(chuàng)建工程時(shí),注意要添加對(duì)RdpEncom.dll引用。
4 小結(jié)
本文利用微軟提供的桌面共享API,提出了一個(gè)運(yùn)行在Windows7平臺(tái)下的屏幕廣播解決方案,通過(guò)軟件在機(jī)房中的使用測(cè)試,屏幕廣播的效果不錯(cuò),廣播延時(shí)很小,圖像質(zhì)量也可以接受。而整個(gè)開(kāi)發(fā)過(guò)程卻相當(dāng)簡(jiǎn)單及高效,這為我們提供了開(kāi)發(fā)屏幕廣播軟件的新思路。
參考文獻(xiàn):
[1] 陳紹鈞.屏幕廣播技術(shù)在演示教學(xué)系統(tǒng)中的應(yīng)用[J].實(shí)驗(yàn)室科學(xué),2008(8):144-146.
[2] 張軍翔,劉興紅.屏幕廣播教學(xué)系統(tǒng)在計(jì)算機(jī)類(lèi)課程實(shí)驗(yàn)教學(xué)中的應(yīng)用研究[J].湖北師范學(xué)院:自然科學(xué)版,2013,33(4):100-104.endprint