HarmonyOS 鸿蒙Next 默认情况下怎么使用findWindow方法找到窗口?
口令输入界面可以被截屏或者录屏,参考解决方案:
其中
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
需要创建子窗口,然后再调用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