yellow 发表于 2025-8-6 17:32:19

MacOS下输入文本污染剪贴板 v2.0.18

目前是把文字复制到剪贴板然后再以粘贴的形式把文字输出来,这种方式虽然开发简单容易实现,但用户体验太差了,我按一下按钮,输入的文本就跑到剪贴板,导致之前复制的内容丢了。

macos 上是可以直接输入文字的,开发人员可以参考 https://github.com/ErlichLiu/Whisper-Input 这个项目看看是怎么实现的,这个项目是一个语音输入,语音转换成文字后直接上屏,不是通过剪贴板复制再粘贴这种操作。\
另外还有一种方式是模拟键盘输入,但这种方式在中文输入法的情况下, 输入法会影响本身的输出,强制使用 macos 的英文键盘做 type_text 就可以。

希望能够尽快更新版本,这个问题真的非常影响用户使用。

红桃K 发表于 2025-8-7 09:43:11

1,第一个 ,文本按键一下,就是复制到剪切板,这个要是不复制到剪切版,还有其它方式实现吗,我感觉语音不是一个概念,它是语音转文本的引擎实现吧,能力强大多了。——期待技术来看看,我也想知道,不经过剪切板,还有什么技术方案
2,第二个,特别是在AI、PS等设计界面,输入法要是中文,总要自己切成英文,不知道有没有办法,能不能先调用系统的输入切到英文,这样按键效率就高一些。不仅仅是Mac,Windows也需要啊

yellow 发表于 2025-8-7 14:18:24

红桃K 发表于 2025-8-7 09:43
1,第一个 ,文本按键一下,就是复制到剪切板,这个要是不复制到剪切版,还有其它方式实现吗,我感觉语音不 ...

1. 他是语音转文本,文本要上屏,也就是输入文字到当前文本框,这一部分可以参考他是怎么把文字输入到文本框的。也就是除了剪贴板还有其他方式的,类似的软件很多包括很多翻译软件也是可以直接把文字输入到文本框。
2. 跟输入法没关系,应该不是走的键盘输入,是另一个种方式把文字输入的

退一万步,就算是走剪贴板,多一个步骤把现有剪贴板内容存一下,粘贴输入完再放回去,别把用户之前复制的东西搞没了啊

yellow 发表于 2025-8-8 20:35:57

另外还有个问题,使用剪贴板,经常会卡个零点几秒,官方用了一个开发最简单的方式却一点也没考虑用户体验。

Ulanzi 发表于 2025-8-12 09:47:11

感谢反馈,1、文本的功能我们后面在迭代优化,文本模式除了支持从剪切板粘贴,还支持模拟输入,2、使用剪贴板,经常会卡个零点几秒,这个我们在排查下。

yellow 发表于 2025-8-12 10:48:02

本帖最后由 yellow 于 2025-8-13 10:06 编辑

Ulanzi 发表于 2025-8-12 09:47
感谢反馈,1、文本的功能我们后面在迭代优化,文本模式除了支持从剪切板粘贴,还支持模拟输入,2、使用剪贴 ...
文字上屏,如果是原生 macos 开发,下面的脚本供参考(经过实测使用没有问题)。
使用快捷键调用这个脚本,可以把里面的 text 直接输入上屏,中文输入法下也正常。



#!/usr/bin/env swift
import Foundation
import ApplicationServices

func parseArguments() -> String? {
    let arguments = CommandLine.arguments
   
    if let textIndex = arguments.firstIndex(of: "--text"),
       textIndex + 1 < arguments.count {
      return arguments
    } else if arguments.count == 2 {
      return arguments
    }
   
    return nil
}

guard let text = parseArguments() else {
    exit(1)
}

let source = CGEventSource(stateID: .hidSystemState)

if text.hasPrefix("\n") {
    // 分别处理换行和文本
    let remainingText = String(text.dropFirst())
   
    // 1. 先发送换行 (Alt+Enter)
    let altEnterDown = CGEvent(keyboardEventSource: source, virtualKey: 36, keyDown: true)
    let altEnterUp = CGEvent(keyboardEventSource: source, virtualKey: 36, keyDown: false)
    altEnterDown?.flags = .maskAlternate
    altEnterUp?.flags = .maskAlternate
   
    altEnterDown?.post(tap: .cghidEventTap)
    altEnterUp?.post(tap: .cghidEventTap)
   
    // 2. 强制等待换行处理完成
    Thread.sleep(forTimeInterval: 0.015) // 15ms
   
    // 3. 发送文本
    if !remainingText.isEmpty {
      let utf16Array = Array(remainingText.utf16)
      
      let keyDown = CGEvent(keyboardEventSource: source, virtualKey: 0, keyDown: true)
      let keyUp = CGEvent(keyboardEventSource: source, virtualKey: 0, keyDown: false)
      
      keyDown?.keyboardSetUnicodeString(stringLength: utf16Array.count, unicodeString: utf16Array)
      keyUp?.keyboardSetUnicodeString(stringLength: utf16Array.count, unicodeString: utf16Array)
      
      keyDown?.post(tap: .cghidEventTap)
      keyUp?.post(tap: .cghidEventTap)
    }
} else {
    // 没有换行符,直接发送整个文本
    let utf16Array = Array(text.utf16)
   
    let keyDown = CGEvent(keyboardEventSource: source, virtualKey: 0, keyDown: true)
    let keyUp = CGEvent(keyboardEventSource: source, virtualKey: 0, keyDown: false)
   
    keyDown?.keyboardSetUnicodeString(stringLength: utf16Array.count, unicodeString: utf16Array)
    keyUp?.keyboardSetUnicodeString(stringLength: utf16Array.count, unicodeString: utf16Array)
   
    keyDown?.post(tap: .cghidEventTap)
    keyUp?.post(tap: .cghidEventTap)
}



用法:
// 先编译成二进制
swiftc -O inputscript.swift -o inputscript

// 然后运行
inputscript --text $'第一行文字\n第二行文字'






哒哒哒哒 发表于 2025-8-12 22:28:31

赞赞赞,高手在民间~
👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍

Ulanzi 发表于 2025-8-18 10:39:23

yellow 发表于 2025-8-12 10:48
文字上屏,如果是原生 macos 开发,下面的脚本供参考(经过实测使用没有问题)。
使用快捷键调用这个脚本 ...

感谢提供的代码建议,后续实现的话,会充分参考。
页: [1]
查看完整版本: MacOS下输入文本污染剪贴板 v2.0.18