朱利龍
(青島理工大學(xué),山東 臨沂 273400)
實(shí)踐教學(xué)屏幕共享技術(shù)的研究
朱利龍
(青島理工大學(xué),山東 臨沂 273400)
目前,高校多媒體教學(xué)實(shí)驗(yàn)室存在難以跨網(wǎng)段演示的困難,即便是能夠演示也多需要增加額外的物理設(shè)備。通過分析和研究現(xiàn)有的屏幕共享技術(shù)和方法,提出了基于GDI+技術(shù)采用C#實(shí)現(xiàn)的實(shí)踐教學(xué)屏幕共享系統(tǒng),實(shí)現(xiàn)了教學(xué)屏幕的跨網(wǎng)段廣播,避免了實(shí)踐教學(xué)中不必要的重復(fù)性勞動(dòng)。
屏幕共享;C#;GDI+;垃圾回收
目前,各高校在計(jì)算機(jī)類課程的實(shí)踐教學(xué)過程中,任課老師通常通過諸多的多媒體教學(xué)軟件將實(shí)踐操作演示給學(xué)生,例如紅蜘蛛多媒體網(wǎng)絡(luò)教室、極域電子教室、凌波多媒體網(wǎng)絡(luò)教室等等。這些網(wǎng)絡(luò)多媒體教學(xué),在單個(gè)網(wǎng)段內(nèi)將教師機(jī)屏幕展現(xiàn)給學(xué)生比較容易,但是學(xué)生機(jī)器上必須安裝響應(yīng)學(xué)生端軟件,否則無法訪問。而且在多個(gè)網(wǎng)段中演示教師機(jī)的操作時(shí),這些系統(tǒng)也無法實(shí)現(xiàn)屏幕共享,亦或是需要另行安裝相關(guān)設(shè)備,從而造成系統(tǒng)安裝比較復(fù)雜。本文將就據(jù)此設(shè)計(jì)相關(guān)系統(tǒng),解決此類問題。
現(xiàn)在某些公司也提供了專門視頻類屏幕共享設(shè)備,如實(shí)時(shí)協(xié)作服務(wù)器R-HUB。但在實(shí)踐教學(xué)過程中使用這些設(shè)備,會(huì)增大教學(xué)成本較大,而且大材小用造成設(shè)備的功能浪費(fèi)。還有諸多屏幕共享工具NetMeeting和InletexEMC等軟件也可以提供屏幕共享和同步操作等功能,但是實(shí)踐教學(xué)過程中,大量并發(fā)訪問會(huì)造成系統(tǒng)當(dāng)機(jī),經(jīng)常導(dǎo)致學(xué)生端無法正常訪問。另外諸如紅蜘蛛等多媒體教學(xué)系統(tǒng),教師在演示的過程中,只能讓學(xué)生看到教師操作,而不能跟著同時(shí)操作,存在一定的缺陷和不足。
經(jīng)分析發(fā)現(xiàn)教學(xué)屏幕共享,實(shí)質(zhì)上共享的就是通過某種技術(shù)將教師機(jī)的屏幕傳給學(xué)生端。因此,本文首先采用基于GDI+技術(shù)和JPG圖像壓縮的方式,以C#程序語(yǔ)言為設(shè)計(jì)工具,通過循環(huán)抓圖的方法生成教師機(jī)屏幕的圖像,然后借助開源Web服務(wù)器采用B/S模式傳給學(xué)生端。這樣做,不僅可以實(shí)現(xiàn)屏幕共享,而且可以讓學(xué)生邊看邊操作,從而加強(qiáng)學(xué)生記憶,以免演示過后,學(xué)生遺忘操作步驟。
屏幕圖像的抓取采用微軟提供的圖形設(shè)備接口GDI+技術(shù),該技術(shù)可以實(shí)現(xiàn)操作系統(tǒng)與屏幕繪圖之間的資源共享,包括光標(biāo)和其他程序界面的顯示。程序員借助這些資源的上下文句柄HDC,便可以獲取教師機(jī)的含有光標(biāo)痕跡的屏幕圖像,而無需關(guān)心顯卡驅(qū)動(dòng)和具體的繪圖過程。在C#中,可以通過Graphics類的方法來獲取屏幕圖像,然后Cursor類的Draw方法將光標(biāo)繪制在抓取的屏幕圖像中。
抓取的屏幕圖像默認(rèn)是位圖格式,若直接傳輸?shù)綄W(xué)生端不但浪費(fèi)帶寬,而且由于循環(huán)抓圖時(shí)間間隔不長(zhǎng),將會(huì)導(dǎo)致學(xué)生端圖像顯示卡頓。因此需要對(duì)抓取的圖像進(jìn)行壓縮。在C#中ImageFormat類的Jpeg屬性便可以實(shí)現(xiàn)將圖像轉(zhuǎn)換為JPG格式。最后通過B/S模式來將屏幕圖像傳給學(xué)生端。
本系統(tǒng)設(shè)計(jì)一個(gè)名為getScrPic的方法來實(shí)現(xiàn)屏幕圖像的獲取,該函數(shù)將返回一個(gè)Image對(duì)象。該方法首先根據(jù)Image對(duì)象的Bitmap方法創(chuàng)建屏幕大小的一張位圖,采用Graphics類提供的FromImage方法將其轉(zhuǎn)換成Graphics對(duì)象,以便該對(duì)象的CopyFromScreen方法拷貝教師機(jī)的屏幕圖像。其部分代碼如下:
int ScrW=Screen.PrimaryScreen.WorkingArea.Width;
int ScrH=Screen.PrimaryScreen.WorkingArea.Height;
ScrImg=new Bitmap(ScrW,ScrH);//ScrImg為類的靜態(tài)屬性成員
Graphics ScrG=Graphics.FromImage(ScrImg);
ScrG.CopyFromScreen(new Point(0,0),new Point(0,0),new Size (ScrW,ScrH));
其次,再通過Windows API提供的GetCursorInfo方法獲取全局光標(biāo)的句柄將其轉(zhuǎn)化為,以便用 System.Windows.Forms命名空間中Cursor對(duì)象,并進(jìn)行光標(biāo)繪制。其部分代碼如下:
CURSORINFO ScrPci;
int CurW=ScrCur.Size.Width,CurH=ScrCur.Size.Height;
long x=ScrPci.ptScreenPos.x,y=ScrPci.ptScreenPos.y;
Cursor ScrCur=new Cursor(ScrPci.hCursor);
ScrPci.cbSize=Marshal.SizeOf(typeof(CURSORINFO));
GetCursorInfo(out ScrPci);
ScrCur.Draw(ScrG,new Rectangle(x-10,y-10,CurW,CurH));
最后,設(shè)置一個(gè)計(jì)時(shí)器,根據(jù)所設(shè)間隔時(shí)間調(diào)用上述定義的getScrPic方法不斷截取教師機(jī)最新的屏幕圖像。在該方法的實(shí)現(xiàn)中,由于截圖時(shí)常占用內(nèi)存,若不處理好內(nèi)存資源的回收問題,將會(huì)導(dǎo)致內(nèi)存爆滿問題。本文采用Image對(duì)象的Dispose方法和GC垃圾回收機(jī)制共同來解決這個(gè)問題,由圖1給出的資源占用情況對(duì)比圖可以看出本文給出的方法效果不錯(cuò)。其參考代碼如下:
getScrPic().Save(path,System.Drawing.Imaging.ImageFormat.Jpeg);
ScrImg.Dispose();//釋放圖像所占資源
GC.Collect();//強(qiáng)制進(jìn)行垃圾回收,以便進(jìn)一步釋放系統(tǒng)所占資源
系統(tǒng)設(shè)計(jì)的最終界面非常簡(jiǎn)單,如圖2所示。其中單機(jī)開始按鈕將會(huì)調(diào)用系統(tǒng)計(jì)時(shí)器timerScr_Tick方法來完成循環(huán)截圖,并Process對(duì)象的Start方法啟動(dòng)開源的Web服務(wù)器軟件MiniWeb.exe。學(xué)生端將訪問屏享系統(tǒng)的主頁(yè)index.html,該網(wǎng)頁(yè)將會(huì)借助JavaScript腳本循環(huán)顯示教師機(jī)截取的圖像。
本文所設(shè)計(jì)的系統(tǒng)解決了屏幕共享跨網(wǎng)段的問題,并簡(jiǎn)化了教學(xué)系統(tǒng)的安裝過程。不僅改進(jìn)了實(shí)踐教學(xué)的教學(xué)方法和教學(xué)手段,幫助老師從繁重的工作中解脫出來,而且提高實(shí)踐教學(xué)的教學(xué)質(zhì)量和學(xué)生的學(xué)習(xí)積極性。
[1]張宗飛.VB中屏幕共享系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2008,(4):84-86.
[2]陳劍甌.javaScript基礎(chǔ)教程(第8版)[M].北京:人民郵電出版社,2012年.
[3]錢哨.C#WinForm實(shí)踐開發(fā)教程[M].北京:中國(guó)水利水電出版社,2010年.
[責(zé)任編輯:朱麗娜]