HarmonyOS 鸿蒙Next 默认情况下怎么使用findWindow方法找到窗口?

发布于 1周前 作者 sinazl 最后一次编辑是 5天前 来自 鸿蒙OS

口令输入界面可以被截屏或者录屏,参考解决方案:

https://developer.huawei.com/consumer/cn/doc/best-practices-V5/bpta-harmony-application-security-V5#section18516943133816

其中

let windowClass: window.Window = window.findWindow("test");
请问我的EntryAbility.ets中,并没有额外写相关createWindow之类的方法,是默认的onWindowStageCreate中拿到windowStage,那这种默认情况下的创建的窗口,我要如何在具体页面的组件中拿到这个窗口呢,这个窗口的name是什么?有大佬可以解下惑吗?

onWindowStageCreate(windowStage: window.WindowStage): void {

  // Main window is created, set main page for this ability

  hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate')

  GlobalContext.getContext().setObject('windowStage', windowStage)

  GlobalContext.getContext().setObject('uiAbilityContext', this.context)

  windowStage.loadContent('pages/SplashPage', (err) => {

  if (err.code) {

  hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '')

  return

}

// 持久化数据初始化

initPersistProps([

  { key: 'agreeAppProtocol', defaultValue: false },

  { key: 'userInfo', defaultValue: '' },

])

// 持久化存储存入全局 AppStorage

UserInfo.setAppStorageFromPersist()

hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.')

})

}

更多关于HarmonyOS 鸿蒙Next 默认情况下怎么使用findWindow方法找到窗口?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

需要创建子窗口,然后再调用findWindow。具体demo如下: // 在EntryAbility中创建了一个子窗口,未使用AppStorage保存windowStage在其他场景创建,这里只模拟最小场景

let windowStage_: window.WindowStage | null = null;

let sub_windowClass: window.Window | null = null;

export default class EntryAbility extends UIAbility {

   // 在onWindowStageCreate中调用该方法,创建子窗口

  showSubWindow() {

    // 1.创建应用子窗口。

    if (windowStage_ )  {

      windowStage_.createSubWindow("mySubWindow", (err: BusinessError, data) => {

        let errCode: number = err.code;

        if (errCode) {

          return;

        }

        sub_windowClass = data;

        // 2.子窗口创建成功后,设置子窗口的位置、大小及相关属性等。

        sub_windowClass.moveWindowTo(300, 300, (err: BusinessError) => {

          let errCode: number = err.code;

          if (errCode) {

            return;

          }

        });

        sub_windowClass.resize(500, 500, (err: BusinessError) => {

          let errCode: number = err.code;

          if (errCode) {

            return;

          }

        });

        // 3.为子窗口加载对应的目标页面。

        sub_windowClass.setUIContent("pages/page3", (err: BusinessError) => {

          let errCode: number = err.code;

          if (errCode) {

            console.error('Failed to load the content. Cause:' + JSON.stringify(err));

            return;

          }

          console.info('Succeeded in loading the content.');

          // 3.显示子窗口。

          (sub_windowClass as window.Window).showWindow((err: BusinessError) => {

            let errCode: number = err.code;

            if (errCode) {

              console.error('Failed to show the window. Cause: ' + JSON.stringify(err));

              return;

            }

            console.info('Succeeded in showing the window.');

          });

}
接上部分代码

import window from '@ohos.window';

@Entry

@Component

struct Page01 {

  @State message: string = 'Hello World';

// 窗口大小被修改

  aboutToAppear(): void {

     window.findWindow('mySubWindow').resize(300,400)

  }

  build() {

    Row() {

      Column() {

        Text(this.message)

          .fontSize(50)

          .fontWeight(FontWeight.Bold)

          .onClick(() => {

            // 子窗口被销毁

            window.findWindow('mySubWindow').destroyWindow()

          })

      }

      .width('100%')

    }

    .height('100%')

  }

}

// 导出页面,在主页面中使用

export default Page01

更多关于HarmonyOS 鸿蒙Next 默认情况下怎么使用findWindow方法找到窗口?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


是指在单页面实现防截屏,而不是整个APP,是么?感觉你问的是这个 -- 否则 findWindow和createSubWindow是一对,可以根据名称获取到对应window

可以在EntryAbility.ets的onWindowStageCreate中获取到windowStage对象,保存到APPStorage中,之后在具体的页面上获取到该对象,设置隐私模式

具体实现:

// 获取windowClass对象并保存
    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. Cause: ' + JSON.stringify(err));
        return;
      }
      windowClass = data;
      console.info('Succeeded in obtaining the main window. Data: ' + JSON.stringify(data));
      AppStorage.setOrCreate("windowClass", windowClass)
    })
private windowClass = AppStorage.get("windowClass") as window.Window

aboutToAppear(): void { let isPrivacyMode: boolean = true this.windowClass.setWindowPrivacyMode(true); // 设置防截屏录屏 }

备注1:获取APPStorage对象也可以直接使用@StorageProp

备注2:需要防截屏生效,一定要声明窗口隐私模式权限

{
“name”: “ohos.permission.PRIVACY_WINDOW”
}

在HarmonyOS 鸿蒙Next中,默认情况下使用findWindow方法找到窗口的过程涉及调用系统API来检索目标窗口对象。以下是实现该操作的基本步骤和代码示例:

首先,确保你的应用已获取必要的权限,包括窗口管理权限等。

接着,你可以通过AbilityContext或ApplicationContext调用相关API来执行窗口查找。具体代码示例如下:

#include <ability_context.h>
#include <window_manager.h>

// 假设你有一个AbilityContext实例指针context
OHOS::sptr<OHOS::AAFwk::IWindowManager> windowManager = context->GetWindowManager();
if (windowManager != nullptr) {
    OHOS::WindowToken token = /* 你需要查找的窗口的token */;
    OHOS::sptr<OHOS::IWindow> window = windowManager->GetWindow(token);
    if (window != nullptr) {
        // 窗口对象已找到,进行操作
    } else {
        // 窗口对象未找到
    }
} else {
    // 窗口管理器获取失败
}

注意:WindowToken的获取通常依赖于具体的上下文和窗口管理策略,可能需要根据实际场景进行调整。

以上代码展示了如何获取窗口管理器并尝试通过窗口令牌查找窗口。若findWindow方法在你的环境中是特定封装或扩展,请查阅HarmonyOS官方文档或相关API参考。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部