屏幕共享
  • iOS
  • Android
  • macOS
  • Windows : C++
  • Electron
  • 下载
  • 跑通示例源码
  • 快速开始
  • 最佳实践
  • API 文档
  • 常见问题
  • 文档中心
  • 屏幕共享
  • 快速开始
  • 窗口缩略图

窗口缩略图

更新时间:2021-09-30 11:25

1 简介

窗口缩略图主要是辅助窗口分享和屏幕分享选择相应的窗口或屏幕。

本文主要讲述如何设置窗口缩略图分享,详情请参考示例Demo

2 缩略图调用流程

1. 初始化

/*
设置日志路径和级别
*/
zego_screencapture_set_log_level(kZegoLogLevelDebug, logDir);

/*
初始化
*/
zego_screencapture_init();

/*
设置窗口状态变化回调
*/
zego_windowthumbnail_window_status_change_notify(WindowChangeCallback,nullptr);

2. 获取窗口列表

/*
获取可以建立缩略图的窗口和屏幕
*/
ZegoThumbnailWindowInfo* pInfo = zego_windowthumbnail_find_windows(&iCount);

3. 注册缩略图

/*
客户端提供顶层窗口和显示区域,用来显示缩略图,SDK将会把源窗口缩略图绘制到对应区域
*/
zego_windowthumbnail_register((ZegoWindowHandle)this->winId(), info[i].thumbnail_id, &rect)

4. 绘制窗口标题和窗口图标

/*
zego_windowthumbnail_find_windows返回的窗口信息结构如下,客户端根据此信息绘制预览时的窗口标题和窗口所在进程的图标
*/
struct ZegoThumbnailIconBits
{
    int width;                ///< 窗口对应图标的宽(像素)
    int height;                ///< 采集画面高(像素)
    int format;                ///< (未使用) 默认BGRA32
    unsigned int len;        ///< 窗口对应图标画面数据大小
    unsigned char* bits;    ///< 窗口对应图标画面数据
};

struct ZegoThumbnailWindowInfo
{
    int thumbnail_id;                            ///< 缩略图ID
    ZegoWindowHandle handle;                    ///< 窗口句柄
    char window_title[ZEGO_MAX_TITLE];            ///< 窗口标题(windows当isScreen为true时 格式为 屏幕1----\\\\.\\DISPLAY1)
    ZegoThumbnailIconBits *icon_bits;            ///< 源窗口进程图标数据
#ifndef WIN32
    ZegoThumbnailIconBits *image_bits;            ///< (macOS使用) 缩略图数据
#endif
    bool isScreen;                                ///< 是否是屏幕
};

5. 显示源窗口

/*
客户端选中其中窗口进行分享时,可以调用zego_windowthumbnail_show_source_window方法将源窗口进行置顶显示
*/
if (event->type() == QEvent::MouseButtonDblClick)
{
    QPoint coursePoint;
    coursePoint = QCursor::pos();//获取当前光标的位置
    coursePoint = QWidget::mapFromGlobal(coursePoint);
    for (const auto& it : m_Infos)
    {
        if (it.rectThumbnail.contains(coursePoint))
        {
            //it.WinID可作为窗口分享的窗口句柄
            m_CaptureWinID = it.WinID;
            zego_windowthumbnail_show_source_window((ZegoWindowHandle)it.WinID, kZegoThumbnailShowWindowCmdShow);
            this->hide();
            break;
        }
    }
}

6. 窗口状态变化回调

/*
已经注册缩略图的窗口,当窗口标题发生改变或者窗口被关闭,或者有新窗口建立,将产生回调,用来更新预览窗口的缩略图
*/
void NotifyWindowChangeCallback(WindowStatus ChangeCode,int id,HWND hWnd, const char* szWindowName)
{
    if (ChangeCode == WND_STATUS_DESTROY||ChangeCode == WND_STATUS_INVALID)
    {
        //客户端缩略图显示区重新绘制

        zego_windowthumbnail_unregister(thumbnail_id);
     }
    else if (ChangeCode == WND_STATUS_CREATE)
    {
        //客户端分配缩略图显示区

        zego_windowthumbnail_register(/*...*/);
    }
    else if (ChangeCode == WND_STATUS_NAMECHANGE)
    {
        //原缩略图名称变化
    }
}

7. 反注册缩略图

1,窗口状态变化回调返回窗口无效或者销毁时反注册缩略图

2,关闭时反注册所有缩略图

if (event->type() == QEvent::Hide)
{
    for (const auto& it : m_Infos)
    {
        zego_windowthumbnail_unregister(it.ThumbnailID);
    }
    m_Infos.clear();
}

3 缩略图效果图

本篇目录