HarmonyOS鸿蒙Next中AVScreenCapture屏幕录制窗口模式,窗口大小发生变化后,如何获取窗口大小

HarmonyOS鸿蒙Next中AVScreenCapture屏幕录制窗口模式,窗口大小发生变化后,如何获取窗口大小 采集模式为 录制指定窗口推荐 OH_CAPTURE_SPECIFIED_WINDOW

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/avscreencapture-c-basic-process#录制指定窗口推荐

static void OnCaptureContentChanged(OH_AVScreenCapture *capture, OH_AVScreenCaptureContentChangedEvent event,
                                    OH_Rect *area, void *userData);
OH_AVScreenCapture_SetCaptureContentChangedCallback(capture_, OnCaptureContentChanged, this);

设置录屏内容变更回调事件。

在窗口最大化,最小化后收到此回调,其中最大化的时候OH_Rect 指针不为空,包含窗口的大小

如何能在调整窗口大小后也能收到包含OH_Rect指针的回调?


更多关于HarmonyOS鸿蒙Next中AVScreenCapture屏幕录制窗口模式,窗口大小发生变化后,如何获取窗口大小的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

【背景知识】

HarmonyOS的窗口模块将窗口界面分为系统窗口、应用窗口两种基本类型。

  • 系统窗口:系统窗口指完成系统特定功能的窗口。如音量条、壁纸、通知栏、状态栏、导航栏等。
  • 应用窗口:应用窗口区别于系统窗口,指与应用显示相关的窗口。根据显示内容的不同,应用窗口又分为应用主窗口、应用子窗口两种类型。应用窗口开发可以参考管理应用窗口(Stage模型)
    • 应用主窗口:应用主窗口用于显示应用界面,会在"任务管理界面"显示。设置方式参考设置应用主窗口
    • 应用子窗口:应用子窗口用于显示应用的弹窗、悬浮窗等辅助窗口,不会在"任务管理界面"显示。应用子窗口的生命周期跟随应用主窗口。设置方式参考设置应用子窗口

ArkTS与Native跨语言交互开发详见使用Node-API实现跨语言交互开发流程

【解决方案】

Native侧可以通过WindowManager模块的C API对窗口进行控制,使用OH_WindowManager_GetWindowProperties()获取窗口信息,由于其接口均需要windowID作为入参,需要在调用前获取到windowID。

实现Native侧获取窗口ID可参考如下步骤:

  1. 由于在Native侧无法直接获取window实例,需要在ArkTS侧Ability的onWindowStageCreate生命周期中获取。
onWindowStageCreate(windowStage: window.WindowStage): void {
  // Main window is created,set main page for this ability
  hilog.info(0x0000, 'testTag', '%{public}s','Ability onWindowStageCreate');
  // 1.获取应用主窗口。
  let windowClass: window.Window | null = null;
  windowStage.getMainWindow((err: BusinessError, data) => {
    let errCode: number = err.code;
    if (errCode) {
      console.error(`Failed to obtain the main window. CCode:${err.code}, message:${err.message}`);
      return;
    }
    windowClass = data;
    // 通过windowClass的getWindowProperties方法获取id信息
    this.windowID = windowClass.getWindowProperties().id;
    console.info(`Succeeded in obtaining the main window. Result:${data}`);

  })
  windowStage.loadContent('pages/Index', (err) => {
    if (err.code) {
      hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
      return;
    }
    hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
  });
}
  1. 获取到windowID后,调用Native方法将windowID传入Native侧。
import native from 'libentry.so'
// ...
native.setWindowID(this.windowID)
  1. 在Native侧接收到windowID后,将windowID进行固化用于后续使用。
int32_t g_WindowID;
static napi_value SetWindowID(napi_env env, napi_callback_info info)
{
    size_t argc = 1;
    napi_value args[1] = {nullptr};
    napi_typedarray_type type_napi;

    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);

    napi_get_value_int32(env, args[0], &g_WindowID);

    OH_LOG_INFO(LOG_APP, "get windowID %{public}d", g_WindowID);
    return nullptr;
}

更多关于HarmonyOS鸿蒙Next中AVScreenCapture屏幕录制窗口模式,窗口大小发生变化后,如何获取窗口大小的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


加油,

在HarmonyOS鸿蒙Next中,使用AVScreenCapture进行窗口模式屏幕录制时,若窗口大小发生变化,可通过注册窗口变化监听事件来实时获取新尺寸。具体调用AVScreenCapture的on(‘windowChange’)方法监听窗口变化,在回调函数中获取更新后的窗口宽高参数。窗口尺寸变化时会自动触发该事件,无需主动轮询查询。

在HarmonyOS Next的AVScreenCapture中,当窗口大小发生变化时,可以通过设置内容变更回调来获取窗口大小。根据你提供的代码片段,OnCaptureContentChanged回调函数中的OH_Rect *area参数会在窗口最大化时包含窗口的尺寸信息。

要实现窗口大小调整时都能收到包含OH_Rect指针的回调,需要确保:

  1. 正确设置回调函数:使用OH_AVScreenCapture_SetCaptureContentChangedCallback注册内容变更回调
  2. 在回调函数中处理OH_AVScreenCaptureContentChangedEvent事件类型,特别是OH_SCREEN_CAPTURE_CONTENT_RESIZED事件
  3. 当事件类型为窗口大小变化时,OH_Rect *area参数会包含新的窗口尺寸

需要注意的是,目前文档显示仅在窗口最大化时OH_Rect指针不为空。对于其他窗口大小调整场景,可能需要检查具体的API实现或等待后续版本对更多窗口操作事件的支持。建议在实际测试中验证不同窗口操作(如拖拽调整、最大化、还原等)是否会触发相应的回调并返回有效的OH_Rect数据。

回到顶部