|
本帖最后由 yellow 于 2025-8-13 10:06 编辑
文字上屏,如果是原生 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[textIndex + 1]
} else if arguments.count == 2 {
return arguments[1]
}
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第二行文字'
|
|