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
}
}
}
}
基本上,我试图检测用户何时将某些内容复制到剪贴板并执行操作。在这种情况下,我正在尝试播放声音;我已将声音文件导入 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
}
}
}
}