发布时间:2026/9/8 11:17:47
《随机乱序键盘》二、防截屏功能使用指南 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

相关新闻

2026/9/8 9:57:12

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

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

2026/9/6 21:20:34

免费开源自动化工具KeymouseGo:5分钟掌握鼠标键盘录制技巧

免费开源自动化工具KeymouseGo:5分钟掌握鼠标键盘录制技巧 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo 还在…

2026/9/1 16:18:50

无需编程!用WebWalker让AI自动完成网页信息搜集的完整指南

无需编程!用WebWalker让AI自动完成网页信息搜集的完整指南 WebWalker是一个革命性的AI网页遍历工具,专门为大语言模型(LLM)在网页导航和信息搜集任务中的性能评估而设计。这个开源项目让普通人也能轻松实现AI自动网页信息搜集&am…

2026/9/8 11:13:02

RAG知识库从零搭建:文档切分、向量检索到部署全流程指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/8 11:13:02

.NET上位机开发:字节序大小端问题与安全解析方案

说个我自己的糗事。前几年调一个无线采集模块的上位机,传感器数据一直不对,电压值一会儿是15.0一会儿是1.4e-35,看起来完全随机。用串口助手抓了原始报文,发现设备返回的是 00 00 70 41 ,而我用BitConverter直接转fl…

2026/9/8 11:13:02

AI从给方案到直接建:执行型AI如何在手机上落地生日提醒

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/8 11:13:02

DeepSeek-OCR 部署调用与 LoRA 微调实战:从最小闭环到 RAG 接入

保姆级 DeepSeek-OCR 部署与调用指南:从最小闭环到 LoRA 微调实战最早意识到 OCR 不能继续被忽视,是做一个 RAG 知识库项目的时候。文档量一上来,真正卡住系统的不是向量模型,不是检索算法,而是最前面的解析环节。扫描…

2026/9/8 11:08:02

7代酷睿核显驱动WIN7安装实战:HD630 INF修改全攻略

简介:一份面向英特尔七代CPU(如i5-7500、i7-7700)的Win7集成显卡驱动资源包,专门解决HD Graphics 630等核显在Windows 7下无法原生安装、微软不再提供新硬件官方支持的问题,适合装机维护人员、老系统偏好用户以及遇到兼…

2026/9/8 7:15:10

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/8 7:15:10

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/8 0:01:49

踩多轮坑才跑通|OpenClaw 3.1.0 双平台本地 AI 自动化搭建实操实录

🔹 工具简述 OpenClaw 是一款备受开发者与办公人群青睐的开源本地智能工具,凭借离线本地运行、可视化图形面板、全流程自主任务处理三大核心特点,积累了众多忠实用户。与普通对话类 AI 产品不同,它能够直接调用电脑的软硬件操作权…

2026/9/8 0:01:50

拒绝复杂命令行,Hermes Agent 一键包快速解锁智能办公能力

🔍前言 不少想要体验 Hermes Agent 办公能力的使用者,往往会被复杂的环境配置拦住使用脚步。手动下载匹配依赖、反复调整系统目录、处理命令行持续报错、修复权限异常、补全丢失核心文件等一系列操作,对普通使用者而言门槛较高,很…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/7 22:45:59

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…