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