代码之家  ›  专栏  ›  技术社区  ›  TalkingCode

在NSPasteboard中添加内容时获得通知

  •  7
  • TalkingCode  · 技术社区  · 15 年前

    在我的应用程序中,如果有东西添加到NSPasteboard中,我希望得到通知。如果我从任何其他程序复制文本,我希望我的应用程序知道它。

    在我读过的某个地方,这样做是不可能的。我应该创建一个计时器,自己检查NSPasteboard的内容。

    是这样做的吗?或者有什么通知吗?

    2 回复  |  直到 15 年前
        1
  •  12
  •   Dave DeLong    15 年前

    是的,您基本上必须轮询粘贴板以查看其内容是否已更改。这并不理想,但有可能。基本上,你有一个计时器,每秒触发一到两次,并检查 -[NSPasteboard changeCount] . 如果 changeCount

        2
  •  4
  •   Devarshi    10 年前

    根据Dave DeLong提供的答案,我提出了类似的实现,但在swift中,以下是其要点的链接: PasteboardWatcher.swift

    class PasteboardWatcher : NSObject {
    
        // assigning a pasteboard object
        private let pasteboard = NSPasteboard.generalPasteboard()
    
        // to keep track of count of objects currently copied
        // also helps in determining if a new object is copied
        private var changeCount : Int
    
        // used to perform polling to identify if url with desired kind is copied
        private var timer: NSTimer?
    
        // the delegate which will be notified when desired link is copied
        var delegate: PasteboardWatcherDelegate?
    
        // the kinds of files for which if url is copied the delegate is notified
        private let fileKinds : [String]
    
        /// initializer which should be used to initialize object of this class
        /// - Parameter fileKinds: an array containing the desired file kinds
        init(fileKinds: [String]) {
            // assigning current pasteboard changeCount so that it can be compared later to identify changes
            changeCount = pasteboard.changeCount
    
            // assigning passed desired file kinds to respective instance variable
            self.fileKinds = fileKinds
    
            super.init()
        }
        /// starts polling to identify if url with desired kind is copied
        /// - Note: uses an NSTimer for polling
        func startPolling () {
            // setup and start of timer
            timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("checkForChangesInPasteboard"), userInfo: nil, repeats: true)
        }
    
        /// method invoked continuously by timer
        /// - Note: To keep this method as private I referred this answer at stackoverflow - [Swift - NSTimer does not invoke a private func as selector](http://stackoverflow.com/a/30947182/217586)
        @objc private func checkForChangesInPasteboard() {
            // check if there is any new item copied
            // also check if kind of copied item is string
            if let copiedString = pasteboard.stringForType(NSPasteboardTypeString) where pasteboard.changeCount != changeCount {
    
                // obtain url from copied link if its path extension is one of the desired extensions
                if let fileUrl = NSURL(string: copiedString) where self.fileKinds.contains(fileUrl.pathExtension!){
    
                    // invoke appropriate method on delegate
                    self.delegate?.newlyCopiedUrlObtained(copiedUrl: fileUrl)
                }
    
                // assign new change count to instance variable for later comparison
                changeCount = pasteboard.changeCount
            }
        }
    }
    

    注: 在共享代码中,我试图确定用户是否复制了 目的。