QQ的遠端協助、或者說桌面共享是一個非常實用的功能,所以,2.4版本的GG複製了它,而且,GG增強了桌面共享的功能,它可以允許指定要共享桌面的區域,這樣,對方就只能看到指定區域的桌面,這對節省流量會非常有幫助。
GG實現這些功能的過程並不是那麼簡單,因為內部業務邏輯的關聯容易把人搞暈。從執行起來的程式來說,遠端協助的場景很容易理解:一方是請求方,一方是協助方,邊界非常清晰。但是在程式中,無論是哪一方,其對應的窗體都是ChatForm,所以,在編碼時,你經常需要切換你的思維:一會要站在請求方的角度來考慮、一會又要站在協助方的角度來考慮,並且要把雙方的互動流程控制好。經過一段時間的努力,這些問題終於解決了,最終的程式碼的結構也是相當清晰的,而且,重要的程式碼部分我都新增了註釋。
一.GG V2.4 新增功能展現
相比於2.0版本,除了極少部分的重構外,主要就是增加了遠端協助/桌面共享的功能。其使用流程與QQ類似:
(1)對話雙方的任何一方都可以發出邀請對方協助的請求。
(2)協助方收到請求後,可以選擇接受或拒絕。
(3)在正式協助的過程中,任何一方都可以終止遠端協助。
(4)任何一方掉線,遠端協助也將終止。
廢話不多說,還是先上圖。
發出遠端協助請求:
協助方接收到請求:
協助方接受請求後,開始遠端協助:
協助過程中,請求方的介面:
如果,我指定了QQ影音播放器的區域作為共享區域,則對方看到我的桌面如下:
二.實現思路
雖然提供了原始碼,但是,我還是想將主要的思路列一下,這樣,大家理解起原始碼來,會節省更多的時間。
1. UI方面,增加了一個Form,兩個控制元件。
(1)RemoteHelpForm:遠端桌面的Form,該Form顯示了遠端的桌面內容,並可通過在Form的表面操作來控制遠端桌面。
(2)RemoteHelpHandlePanel:該控制元件用於請求方,在發出請求後,或協助開始後,請求方可以通過來控制元件來取消請求或終止協助。
(3)RemoteHelpRequestPanel:該控制元件用於協助方,當協助方接收到協助請求後,通過該控制元件來回應是否接受請求。
2.內部邏輯關聯(完整流程展現)
(1)請求方:點選請求協助按鈕時,將向協助方傳送InformationTypes.RemoteHelpRequest型別的訊息,並顯示RemoteHelpHandlePanel控制元件。
(2)協助方:接收到(1)的訊息後,顯示RemoteHelpRequestPanel控制元件,如果點選“拒絕”按鈕,則傳送InformationTypes.RejectRemoteHelp訊息給請求方;否則進入(3)
(3)協助方:傳送InformationTypes.AgreeRemoteHelp訊息給請求方,並開啟RemoteHelpForm,連線對方的桌面。
(4)請求方:收到InformationTypes.AgreeRemoteHelp訊息後,RemoteHelpHandlePanel控制元件開始計時。
(5)協助過程中,如果請求方點選RemoteHelpHandlePanel上的按鈕終止遠端協助,則傳送InformationTypes.TerminateRemoteHelp訊息給協助方,協助方將提示訊息,並自動關閉RemoteHelpForm。
(6)協助過程中,如果協助方主動叉掉RemoteHelpForm,則會傳送InformationTypes.CloseRemoteHelp訊息給請求方,請求方將提示資訊,並關閉RemoteHelpHandlePanel。
3.遠端桌面的核心使用的是OMCS提供的DesktopConnector元件,RemoteHelpForm使用了它。
4.通過IMultimediaManager的DesktopRegion屬性來指定要共享的螢幕區域。
5. 通過程式碼可以控制協助方是否可以操作桌面,還是隻能觀看,在RemoteHelpForm的建構函式中設定:
this.desktopConnector1.WatchingOnly = true;
6.遠端桌面的清晰度可以通過程式碼進行控制,在MainForm的Initialize方法中:
this.multimediaManager.DesktopEncodeQuality = 3;//桌面的編碼質量。取值0~31。取值越小,越清晰。
三.GG V2.4 原始碼下載
下載最新版本,請轉到這裡。
注意:如果要將GG部署到廣域網,則可以在服務端的配置檔案中設定監聽的埠;而在客戶端的配置檔案中,則可以指定伺服器的IP和Port。
關於GG的最新全貌介紹,我單獨寫了一篇文章,作為彙總,可參見 可在廣域網部署執行的QQ高仿版 -- GG2013概要。
歡迎和我探討關於GG2013的一切,我的QQ:2027224508,多多交流!
大家有什麼問題和建議,可以留言,也可以傳送email到我郵箱:ggim2013@163.com。
如果你覺得還不錯,請粉我,順便再頂一下啊,呵呵