macOS 复制检测

macOS Copy Detection

基本上,我试图检测用户何时将某些内容复制到剪贴板并执行操作。在这种情况下,我正在尝试播放声音;我已将声音文件导入 Xcode。但是,它由于 while 循环而崩溃,如果我删除 while 循环它仍然崩溃,因为我最后重新启动了程序。我应该怎么做,因为我总是陷入循环并最终程序崩溃并且无法检测到 NSPasteboard 的 changeCount 的变化。声音文件也不起作用,我似乎无法弄清楚为什么。任何帮助都是极好的!!!!只写在 Swift 中。

编辑 1:我知道它崩溃的原因,只是不知道还有什么其他方法可以做到这一点。

import Cocoa
import AVFoundation

class ViewController: NSViewController {
let pasteboard = NSPasteboard.general

override func viewDidLoad() {
    super.viewDidLoad()

    let sound = URL(fileURLWithPath: Bundle.main.path(forResource: "sound", ofType: "mp3")!)

    var audioPlayer: AVAudioPlayer?

    //intializing audio player
    do
    {
        try audioPlayer = AVAudioPlayer(contentsOf: sound)

    }catch{
        print("fail")
    }


    let lastChangeCount=pasteboard.changeCount

    //keep looping until something is copied.
    while(pasteboard.changeCount==lastChangeCount){

    }

    //something is copied to clipboard so play audio
    audioPlayer?.play()

    //restart program
    self.viewDidLoad()

  }

使用 while 循环进行轮询是非常糟糕的习惯,您绝不能调用 viewDidLoad,永远不要。

此版本使用每秒触发一次的 Timer 并检查闭包中的粘贴板。

播放简单的声音 AVFoundation 太过分了

class ViewController: NSViewController {


    var lastChangeCount = 0
    var timer : Timer?

    override func viewDidLoad() {
        super.viewDidLoad()
        let pasteboard = NSPasteboard.general

        lastChangeCount = pasteboard.changeCount
        timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [unowned self] timer in
            if pasteboard.changeCount != self.lastChangeCount {
                NSSound(named: NSSound.Name("sound"))?.play()
                self.lastChangeCount = pasteboard.changeCount
            }
        }
    }
}