HarmonyOS鸿蒙Next能否全局监听复制粘贴事件?或者全局设置应用内复制

HarmonyOS鸿蒙Next能否全局监听复制粘贴事件?或者全局设置应用内复制 业务需求:禁止应用内复制到应用外部粘贴,因此需要重写复制事件,在复制到剪贴板前对复制内容进行加密处理。在粘贴时再揭秘处理。

如何实现?

14 回复
您好,可以参考以下方式解决:

第一步,重写复制事件。在onWindowStageCreate函数中通过systemPasteboard.on('update', listener)监听复制事件。当剪切板内容变化时触发listener回调,在回调内添加读取剪切板内容、清空剪切板、对读取的内容加密、将加密后的内容重新写入剪切板等一系列操作,完成对复制事件的重写,示例代码如下:

```javascript
let systemPasteboard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard(); // 获取系统剪切板
let text: string = '';
let haveData: boolean = true;
let listener = () => { // 设置监听到变化后的回调事件
  haveData = systemPasteboard.hasDataSync();
  if(!haveData) { // 如果没有内容直接返回
    systemPasteboard.setDataSync(pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, text));
    return;
  }
  if(text === 'XXX') { // 判断内容是否加密,可以替换成加密判断函数。此处仅为示例
    text = ''; // 重置
    return;
  }
  text = systemPasteboard.getDataSync().getPrimaryText(); // 读取复制内容
  text = 'XXX'; // 对内容进行加密处理,可以替换成加密函数。此处仅为示例
  systemPasteboard.clearData(); // 清空剪切板
};
systemPasteboard.on('update', listener); // 监听系统剪切板内容变化

第二步,重写粘贴事件。给RichEditor添加onPaste事件,阻止默认粘贴事件的同时对内容重写,示例代码如下:

.onPaste((event?: PasteEvent) => {
  let systemPasteboard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
  let text: string = systemPasteboard.getDataSync().getPrimaryText();
  if(text === 'XXX') { // 判断内容是否加密,可以替换成加密判断函数。此处仅为示例
    text = 'XXXX'; // 对内容进行解密处理,可以替换成解密函数。此处仅为示例
    this.richController2.addTextSpan(text)
    if (event !== undefined && event.preventDefault) {
      event.preventDefault() // 阻止默认粘贴事件
    }
  }
})

更多关于HarmonyOS鸿蒙Next能否全局监听复制粘贴事件?或者全局设置应用内复制的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


没办法阻止系统默认的复制操作只是重写不行,因为系统默认写入剪贴板的同时也会被第三方输入法剪贴板获取,当我们自己重写复制加密的内容存到剪贴板此刻第三方输入法剪贴板已经有我们复制的明文信息。

可以从复制菜单入手,通过bindSelectionMenu给组件绑定自定义菜单,自定义复制行为,参考官网:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-richeditor#

示例3绑定自定义菜单,

你好。

根据你的需求描述,【禁止应用内复制到应用外部粘贴】,可通过对输入框控件设置copyOption属性来控制。参考以下代码:

```typescript
[@Entry](/user/Entry)
[@Component](/user/Component)
struct InputTestPage {

  build() {
    Column() {
      Image($r("app.media.icon_harmonyos"))
        .size({
          width: px2vp(600),
          height: px2vp(200)
        })
      Row(){
        TextInput({
          placeholder: "请输入"
        })
          // 只支持应用内复制。
          .copyOption(CopyOptions.InApp)
      }
    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

实现效果是,在输入框中复制后,到应用外(例如备忘录中)无法粘贴。

你好。

目前在HarmonyOS中实现粘贴。都是通过系统管控的剪切板来实现。无法三方应用自定义。

两种方式访问剪切板:

  1. 申请权限ohos.permission.READ_PASTEBOARD权限,用户授权后三方应用才能访问剪切板的内容。
  2. 使用系统提供的粘贴安全控件(PasteButton),允许应用在用户的授权下无提示地读取剪贴板数据。

目前你能做的只有控制控件是否能复制。

感谢回复,这种方案我试过不行:

  1. 输入框设置了不能复制到应用外,但是复制信息还是会进入输入法剪贴板。
  2. 应用内嵌的h5就没法利用这种方式处理。

我们希望的是自己可以从系统级别拦截整个复制事件,阻止系统的写入剪贴板操作,我们自己对复制内容先进性加密然后自行写入剪贴板,粘贴时从剪贴板取出再解密。

HarmonyOS是闭源系统,怎么可能开放系统级别拦截整个复制事件呢。连互联网大厂都没有这种白名单权限。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17

首先需要纠正一下。

  1. 输入框设置 CopyOptions.InApp,复制信息是不会进入输入法剪贴板。

其次,针对 H5 不能使用原生解决方案的问题:

  1. H5 一般是通过接口 navigator.clipboard.writeText(新方法,推荐使用)将选中的文本复制到剪贴板。此时就可以针对复制内容进行加密。

参考:

import { CopyOptions } from '@harmonyos/arkui';

// 在你的应用中设置复制选项
function setCopyOptions() {
    let copyOptions = CopyOptions.None;
    // 将复制选项设置为None,这样复制和剪切功能将不生效
    this.copyOptions(copyOptions);
}

这样设置可以有效地阻止用户在应用内复制内容,并防止这些内容被粘贴到应用外的其他地方。

我是只允许在应用内复制粘贴,不允许复制出去,还有不是制定某一个组件这样,整个应用层面都这样,如何全局设置。包括应用内嵌的h5。

可以单独写一个识别长按,然后由应用处理弹出复制粘贴,

完全自定义,从复制控件开始到写入剪贴板读取剪贴板

在HarmonyOS鸿蒙Next中,目前没有直接提供全局监听复制粘贴事件的API。开发者可以通过在应用内实现ClipboardManager来监听和操作剪贴板内容,但仅限于应用内部。全局监听或设置复制粘贴事件需要系统级权限,目前鸿蒙系统尚未开放此类功能。建议关注官方文档和更新,以获取最新支持情况。

回到顶部