惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
G
Google Developers Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
有赞技术团队
有赞技术团队
Vercel News
Vercel News
MongoDB | Blog
MongoDB | Blog
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
I
InfoQ
Blog — PlanetScale
Blog — PlanetScale
博客园_首页
The Cloudflare Blog
B
Blog
C
Check Point Blog
Stack Overflow Blog
Stack Overflow Blog
IT之家
IT之家
U
Unit 42
D
Docker
月光博客
月光博客
aimingoo的专栏
aimingoo的专栏
博客园 - Franky
A
About on SuperTechFans

博客园 - zhuweisky

视频会议是如何实现AI会议纪要功能的? .NET 程序在装有企业防水墙的电脑上运行报错:内存不足 uni-app 实现视频聊天、屏幕分享,支持Android、HarmonyOS、iOS 去中心化的内网聊天软件Lachat是如何实现的? 实现鸿蒙(HarmonyOS)视频聊天、屏幕分享 实现一个纯血鸿蒙版(HarmonyOS)的聊天Demo,并可与其它PC、手机端互通! TCP反向代理:将局域网内部的TCP/HTTP服务暴露在公网上 C#实现屏幕墙:同时监控多个电脑桌面(支持Windows、信创Linux、银河麒麟、统信UOS) C#实现语音预处理:降噪、静音检测、自动增益(附Demo源码) 在IM即时通讯系统中接入DeepSeek等AI大模型 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS) 如何实现在服务端录制视频会议? 开发视频会议系统:使用GPU解码渲染视频 如何实现纯网页语音视频聊天和桌面分享?(附源码,PC版+手机版) Avalonia 实现聊天消息渲染、图文混排(支持Windows、Linux、信创国产OS) 如何实现安卓屏幕分享及视频聊天?(源码) C#实现聊天消息渲染、图文混排(支持Windows、Linux) C++调用C#的动态库dll C#推流RTMP,摄像头、麦克风、桌面、声卡(附源码) 如何让C/S应用支持多端(PC、Android、iOS)同时登录? 数据报表开发技巧:自动为数据报表添加【小计】、【总计】行 使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载)
如何实现共享屏幕标注功能?
zhuweisky · 2021-07-05 · via 博客园 - zhuweisky

   在视频会议系统中,经常会有这样的需求:参会人员A共享了自己的屏幕给大家观看,人员B则需要在屏幕图像上做标注,并且希望所有的与会人员都能看到他做的标注。

        这个功能通常被称为共享屏幕标注、或屏幕标注、或带标绘功能的远程桌面。

一.实现方案

   将这个功能拆解开来,实际上就是 远程桌面 + 电子白板,我们可以在远程桌面的控件上叠加一个背景透明的电子白板就可以实现这样的效果。

   接下来,我们尝试使用 OMCS 的远程桌面组件和电子白板组件,来实现这个功能。具体而言,我们在 OMCS入门Demo 的电子白板示例组件上,再增加一个动态桌面连接器,就可以在观看对方桌面的同时进行标绘。

  Demo最终的运行效果如下图所示:

  

二.具体实现    

   我们在OMCS入门demo的白板功能演示的窗口上,增加一个动态桌面连接器(DynamicDesktopConnector),并预定动态桌面连接器相关事件。

          public WhiteBoardForm(string _ownerID)
      {
        InitializeComponent();
        this.whiteBoardConnector1.WatchingOnly = false;

        this.ownerID = _ownerID;
        this.Text = string.Format("正在访问{0}的电子白板", this.ownerID);
        // 需要在设计界面将电子白板连接器的背景改为透明(属性已修改)
        this.whiteBoardConnector1.ConnectEnded += new CbGeneric<ConnectResult>(whiteBoardConnector1_ConnectEnded);
        this.whiteBoardConnector1.BeginConnect(this.ownerID);        
        this.dynamicDesktopConnector1.ConnectEnded += new CbGeneric<ConnectResult>(DynamicDesktopConnector1_ConnectEnded);
        // 将动态桌面连接器控件设置在当前窗口         
this.dynamicDesktopConnector1.SetViewer(this);         this.dynamicDesktopConnector1.BeginConnect(this.ownerID);               }       private void DynamicDesktopConnector1_ConnectEnded(ConnectResult obj)       {         if (this.InvokeRequired)         {           this.BeginInvoke(new CbGeneric<ConnectResult>(this.DynamicDesktopConnector1_ConnectEnded), obj);         }         else         {           if (obj != ConnectResult.Succeed)           {             MessageBox.Show("连接失败!" + obj.ToString());           }                   }       }   

      在点击开始“远程桌面(标绘)”按钮时,我们开始初始化电子白板连接器及动态桌面连接器,连接到目标会议室的房间ID。

      有几点要注意一下:     

(1)电子白板连接器控件的背景色 BackgroundColor 要设置成透明。

(2)必须要使用DynamicDesktopConnector组件,而不能使用DesktopConnector控件。

(3)DynamicDesktopConnector组件所使用的显示屏幕图像的Viewer必须是Form,而不能是Control,否则,电子白板连接器控件的背景透明就无法实现(可能是WinForm的限制)。

(4)所以,UI的整体结构层次是:底层是Form(DynamicDesktopConnector使用该Form的表面来绘制屏幕图像),上层是WhiteBoardConnector控件,背景透明,用于实现标注。

三.源码下载

  在理解了屏幕标注功能的具体实现原理之后,再看Demo源码就非常容易了解了。

       共享屏幕标注Demo(源码)