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