《随机乱序键盘》二、防截屏功能使用指南
HarmonyOS ArkUI 防截屏功能完全指南setWindowPrivacyMode 隐私窗口实践适用版本HarmonyOS NEXTAPI 23、DevEco Studio 6.1关键词ArkUI、防截屏、隐私窗口、setWindowPrivacyMode、PRIVACY_WINDOW、HarmonyOS NEXT效果一、前言在金融、支付、登录等敏感场景中防止应用界面被截屏或录屏是一项重要的安全需求。HarmonyOS NEXT 提供了setWindowPrivacyModeAPI开启后系统会拦截截屏和录屏操作保护窗口内容不被泄露。本文将详细介绍防截屏功能的完整实现流程包括权限配置、API 调用、生命周期管理并提供两个完整示例。二、功能原理开启隐私模式后系统将拦截截屏操作用户按截屏快捷键或手势时截取的图像中该窗口区域显示为黑色拦截录屏操作录屏软件或系统录屏时该窗口内容不会被录制多任务预览模糊在最近任务列表中窗口预览图可能被模糊处理用户操作 → 系统截屏/录屏请求 ↓ 检查 setWindowPrivacyMode 状态 ├── true隐私模式开启→ 窗口区域显示黑色/模糊 └── false正常模式 → 正常截取三、核心 API 详解3.1 setWindowPrivacyModewindow.setWindowPrivacyMode(isPrivacyMode:boolean,callback:AsyncCallbackvoid):void;参数类型说明isPrivacyModebooleantrue开启隐私模式防截屏false关闭callbackAsyncCallbackvoid异步回调返回操作结果也可以使用 Promise 风格window.setWindowPrivacyMode(isPrivacyMode): Promisevoid3.2 获取 Window 实例调用setWindowPrivacyMode需要先获取window.Window实例有两种主要方式方式一通过 WindowStage 获取Ability 层onWindowStageCreate(windowStage:window.WindowStage):void{letmainWindowwindowStage.getMainWindowSync();mainWindow.setWindowPrivacyMode(true,(err){...});}方式二通过 getLastWindow 获取组件/页面层import{window}fromkit.ArkUI;import{common}fromkit.AbilityKit;letcontextthis.getUIContext().getHostContext()ascommon.UIAbilityContext;window.getLastWindow(context).then((lastWindow){lastWindow.setWindowPrivacyMode(true,(err){...});});四、权限配置使用防截屏功能需要在module.json5中声明ohos.permission.PRIVACY_WINDOW权限。4.1 配置步骤第一步打开entry/src/main/module.json5第二步在module节点下添加requestPermissions字段{ module: { name: entry, type: entry, // ... 其他配置 requestPermissions: [ { name: ohos.permission.PRIVACY_WINDOW } ] } }权限说明ohos.permission.PRIVACY_WINDOW属于系统级权限system_grant无需用户手动授权系统会自动授予。4.2 完整 module.json5 示例{ module: { name: entry, type: entry, description: $string:module_desc, mainElement: EntryAbility, deviceTypes: [phone], deliveryWithInstall: true, installationFree: false, pages: $profile:main_pages, requestPermissions: [ { name: ohos.permission.PRIVACY_WINDOW } ], abilities: [ { name: EntryAbility, srcEntry: ./ets/entryability/EntryAbility.ets, description: $string:EntryAbility_desc, icon: $media:layered_image, label: $string:EntryAbility_label, startWindowIcon: $media:startIcon, startWindowBackground: $color:start_window_background, exported: true, skills: [ { entities: [entity.system.home], actions: [ohos.want.action.home] } ] } ] } }五、实现示例示例 1页面级防截屏整个页面禁止截屏适用于银行App主页面、密码管理页面等需要全程保护的场景。// pages/PrivacyPage.etsimport{window}fromkit.ArkUI;import{common}fromkit.AbilityKit;import{BusinessError}fromkit.BasicServicesKit;import{hilog}fromkit.PerformanceAnalysisKit;constDOMAIN0x0000;constTAGPrivacyPage;EntryComponentstruct PrivacyPage{aboutToAppear():void{this.setPrivacyMode(true);}aboutToDisappear():void{this.setPrivacyMode(false);}setPrivacyMode(enable:boolean):void{letcontextthis.getUIContext().getHostContext()ascommon.UIAbilityContext;window.getLastWindow(context).then((lastWindow:window.Window){lastWindow.setWindowPrivacyMode(enable,(err:BusinessError){if(errerr.code){hilog.error(DOMAIN,TAG,设置隐私模式失败: %{public}s,JSON.stringify(err));return;}hilog.info(DOMAIN,TAG,隐私模式已%{public}s,enable?开启:关闭);});}).catch((err:BusinessError){hilog.error(DOMAIN,TAG,获取窗口失败: %{public}s,JSON.stringify(err));});}build(){Column(){Text(此页面已开启防截屏保护).fontSize(20).fontWeight(FontWeight.Medium)Text(截屏操作将被系统拦截截取结果为黑色画面).fontSize(14).fontColor(#666666).margin({top:12})}.width(100%).height(100%).justifyContent(FlexAlign.Center).backgroundColor(#F5F5F5)}}示例 2组件级防截屏键盘弹出时开启收起时关闭适用于自定义安全键盘——仅在键盘显示期间禁止截屏键盘关闭后恢复正常。// components/SecurityKeyboard.etsimport{window}fromkit.ArkUI;import{common}fromkit.AbilityKit;import{BusinessError}fromkit.BasicServicesKit;import{hilog}fromkit.PerformanceAnalysisKit;constDOMAIN0x0000;constTAGSecurityKeyboard;Componentexportstruct SecurityKeyboard{StatekeyboardData:string[][1,2,3,4,5,6,7,8,9,0];aboutToAppear():void{// 键盘显示时开启防截屏this.togglePrivacyMode(true);}aboutToDisappear():void{// 键盘隐藏时关闭防截屏this.togglePrivacyMode(false);}togglePrivacyMode(enable:boolean):void{letcontextthis.getUIContext().getHostContext()ascommon.UIAbilityContext;window.getLastWindow(context).then((lastWindow:window.Window){lastWindow.setWindowPrivacyMode(enable,(err:BusinessError){if(errerr.code){hilog.error(DOMAIN,TAG,切换隐私模式失败: %{public}s,JSON.stringify(err));}});});}build(){Column(){Text(安全键盘).fontSize(14).fontColor(#999999).margin({bottom:8})Flex({wrap:FlexWrap.Wrap}){ForEach(this.keyboardData,(item:string){Button(item).width(80).height(48).margin(4).borderRadius(8).backgroundColor(#FFFFFF).onClick((){// 处理按键点击})},(item:string)item)}.padding(8)}.width(100%).backgroundColor(#E8E8E8)}}在页面中使用// pages/LoginPage.etsimport{SecurityKeyboard}from../components/SecurityKeyboard;EntryComponentstruct LoginPage{StateshowKeyboard:booleanfalse;build(){Column(){TextInput({placeholder:请输入密码}).type(InputType.Password).customKeyboard(this.keyboardBuilder(),{supportAvoidance:true}).width(90%).margin({top:40})}.width(100%).height(100%)}BuilderkeyboardBuilder(){SecurityKeyboard()}}示例 3Ability 全局防截屏应用级保护在EntryAbility的onWindowStageCreate中全局开启// entryability/EntryAbility.etsimport{UIAbility,AbilityConstant,Want}fromkit.AbilityKit;import{window}fromkit.ArkUI;import{BusinessError}fromkit.BasicServicesKit;import{hilog}fromkit.PerformanceAnalysisKit;exportdefaultclassEntryAbilityextendsUIAbility{onCreate(want:Want,launchParam:AbilityConstant.LaunchParam):void{hilog.info(0x0000,EntryAbility,onCreate);}onWindowStageCreate(windowStage:window.WindowStage):void{windowStage.loadContent(pages/Index,(err){if(err.code){hilog.error(0x0000,EntryAbility,加载失败: %{public}s,JSON.stringify(err));return;}// 获取主窗口并全局开启防截屏letmainWindow:window.WindowwindowStage.getMainWindowSync();mainWindow.setWindowPrivacyMode(true,(err:BusinessError){if(errerr.code){hilog.error(0x0000,EntryAbility,设置防截屏失败: %{public}s,JSON.stringify(err));return;}hilog.info(0x0000,EntryAbility,全局防截屏已开启);});});}onForeground():void{}onBackground():void{}onDestroy():void{}onWindowStageDestroy():void{}}六、效果验证方法6.1 手动测试步骤编译运行应用进入开启了防截屏的页面使用系统截屏快捷键电源键 音量下键截屏打开相册查看截图确认截图中该应用窗口区域显示为黑色或空白关闭防截屏后再次截屏对比验证截图内容正常6.2 录屏测试开启系统录屏功能录制包含防截屏页面的操作过程回放录屏视频确认防截屏页面在视频中显示为黑色6.3 最近任务预览测试打开应用进入防截屏页面切换到最近任务列表确认该应用的预览卡片是否被模糊或遮挡七、注意事项7.1 权限要求必须在module.json5中声明ohos.permission.PRIVACY_WINDOW该权限为system_grant类型系统自动授权无需弹窗申请若未声明权限直接调用 API将抛出BusinessError7.2 生命周期管理场景建议页面级保护aboutToAppear开启aboutToDisappear关闭组件级保护如键盘组件onAppear开启onDisAppear关闭全局保护onWindowStageCreate开启onWindowStageDestroy关闭⚠️重要务必在离开页面/组件时关闭隐私模式否则整个应用将持续防截屏影响用户体验。7.3 异步处理setWindowPrivacyMode是异步操作存在执行延迟。若需要确保隐私模式生效后再渲染敏感内容可在回调中处理lastWindow.setWindowPrivacyMode(true,(err){if(!err||!err.code){// 隐私模式已生效可以显示敏感内容this.isPrivacyReadytrue;}});7.4 多窗口场景在多窗口/分屏模式下setWindowPrivacyMode仅对当前窗口生效不影响其他窗口。八、总结防截屏功能是保护应用隐私数据的重要手段实现步骤简洁明了声明权限module.json5中添加ohos.permission.PRIVACY_WINDOW获取窗口通过getLastWindow或getMainWindowSync获取 Window 实例切换模式调用setWindowPrivacyMode(true/false)开关隐私保护管理生命周期在合适的时机开启和关闭避免影响正常功能保护粒度适用场景实现位置全局级银行App全程保护EntryAbility页面级特定敏感页面Page aboutToAppear/Disappear组件级安全键盘、密码输入框Component onAppear/onDisAppear

相关新闻

DevExpress 22.2.6 安装与汉化:3步完成全局GAC注册与项目级引用

DevExpress 22.2.6 安装与汉化:3步完成全局GAC注册与项目级引用

DevExpress 22.2.6 高效安装与深度汉化实战指南1. 环境准备与安装优化在开始DevExpress 22.2.6的安装前,建议先关闭所有Visual Studio实例和正在运行的DevExpress相关程序。安装包通常包含以下核心组件:主控件库:WinForms/WPF基础组件设计时支…

2026/7/12 18:54:31阅读更多 →
ZLMediaKit流媒体服务器部署:从新手到专家的完整解决方案

ZLMediaKit流媒体服务器部署:从新手到专家的完整解决方案

ZLMediaKit流媒体服务器部署:从新手到专家的完整解决方案 【免费下载链接】ZLMediaKit WebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT/STUN/TURN server and client framework based on C11 项目…

2026/7/12 18:54:31阅读更多 →
AI智能攻防30天进阶计划:看懂2026网安新战局

AI智能攻防30天进阶计划:看懂2026网安新战局

📌 三句实话,读懂AI攻防变革第一:网络攻防已经进入「机器对抗机器」的时代。传统人工攻防效率极低,而AI智能体可以自主探测漏洞、生成攻击载荷、批量发起攻击、绕过防御,攻击规模化、隐蔽化、自动化已成趋势&#xff0…

2026/7/12 18:54:31阅读更多 →
Pandas多维聚合实战:金融级数据工程体系构建

Pandas多维聚合实战:金融级数据工程体系构建

1. 项目概述:为什么多维聚合不是“加个groupby”就能搞定的事我在银行风控部门做过三年数据管道开发,后来跳槽到一家头部支付机构做BI平台架构。这期间最常被业务方拍着桌子问的一句话是:“上个月华东区餐饮类商户的交易金额中位数、手续费波…

2026/7/13 4:55:33阅读更多 →
模板驱动型文档自动化:结构化内容生产的工程实践

模板驱动型文档自动化:结构化内容生产的工程实践

1. 项目概述:这不是“套模板写文档”,而是用结构化思维重构内容生产流你有没有过这种体验:接到一个客户提案需求,明明内容骨架早就想清楚了,但光是调格式、对字体、插目录、配图、统一页眉页脚,就耗掉整整半…

2026/7/13 4:55:33阅读更多 →
Pixhawk飞控微调原理与实操:解决悬停漂移和遥控偏移

Pixhawk飞控微调原理与实操:解决悬停漂移和遥控偏移

1. 项目概述:为什么“保存微调”和“自动微调”是飞控调参中真正卡住新手的两道硬门槛 在Pixhawk飞控的实际使用中,绝大多数人卡在两个地方:一是连不上地面站,二是飞起来歪歪扭扭、悬停漂移、油门一松就掉高度——而问题往往不出在…

2026/7/13 4:55:33阅读更多 →
SAP SD V/08 定价过程配置实战:3种销售场景(标准/公司间/免费)差异详解

SAP SD V/08 定价过程配置实战:3种销售场景(标准/公司间/免费)差异详解

SAP SD V/08 定价过程配置实战:3种销售场景差异深度解析1. 定价过程核心逻辑与业务价值定价过程(Pricing Procedure)是SAP SD模块中决定销售单据价格计算规则的核心引擎。它如同一个精密的定价流水线,将基础价格、折扣、附加费、税…

2026/7/13 4:55:33阅读更多 →
现代C++项目构建实战:CMake、动态库与多态性应用指南

现代C++项目构建实战:CMake、动态库与多态性应用指南

1. 项目概述:从零构建一个现代C项目骨架最近在带新人,发现很多刚接触C的朋友,一上来就被各种构建工具、库文件和多态概念搞得晕头转向。他们常问:“我写了个类,怎么让别人用?”“为什么我的程序在Windows上…

2026/7/13 4:55:33阅读更多 →
ROC曲线与AUC:二分类模型阈值权衡与区分能力评估

ROC曲线与AUC:二分类模型阈值权衡与区分能力评估

1. 这不是数学考试,而是一把筛金子的筛子:ROC曲线和AUC到底在解决什么问题?你手头有一堆体检报告,上面写着每个人的血糖、血压、胆固醇数值,还有一栏“是否确诊糖尿病”——这是医生已经盖过章的“真相”。现在&#x…

2026/7/13 4:50:32阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/13 4:47:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/13 0:50:34阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/13 4:52:09阅读更多 →
卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…

2026/7/13 0:04:58阅读更多 →
语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text …

2026/7/13 0:04:58阅读更多 →
Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:04:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/13 4:21:17阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/13 4:08:53阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/12 21:43:43阅读更多 →